Skip to content
Nicolás Seijas edited this page Jul 20, 2026 · 2 revisions

FAQ

When should I use Rambla?

When UI state changes faster than the UI can render it and the intermediate values are disposable: market data, telemetry, dashboards, monitoring, game state, WebSocket-driven UIs. See Philosophy.

When should I not use Rambla?

  • CRUD forms / settings screens — changes are rare, so Rambla is pure overhead.
  • Event streams where every value matters (fills, trades, log lines) — coalescing drops intermediates. Use a queue/stream/change-set instead.
  • Wide fan-outs where each frame touches thousands of distinct properties once — coalescing can't help (see Benchmarks).

Does Rambla replace CommunityToolkit.Mvvm / ReactiveUI / DynamicData?

No. It complements them. Keep the MVVM Toolkit for ObservableObject and commands, ReactiveUI for reactive composition, DynamicData for IChangeSet<T> collections. Rambla owns only the high-frequency background→UI boundary.

Is Rambla faster than a normal PropertyChanged?

No — a single setter is slower (it adds synchronization and dirty tracking). Rambla wins by not emitting the 99,900 notifications a real UI can't render, and by allocating far less. With a no-op subscriber, naive wins. See Benchmarks.

Is BeginUpdate() atomic?

It gives notification coherence (observers are never notified mid-batch), not cross-thread state atomicity. A background reader can still see a new Bid beside a stale Ask before the batch closes. For snapshot consistency, publish an immutable snapshot. See Core Semantics.

What order do PropertyChanged events fire in?

Unspecified within a flush. Don't depend on ordering.

Which UI frameworks are supported?

WPF today (Rambla.Wpf). WinUI and Avalonia are planned — the core is framework-agnostic, so an adapter is just an IStateScheduler.

What .NET version do I need?

The core is netstandard2.0 (broad reach). The repo builds on .NET 10; adapters target the framework they integrate with.

How do I tune the refresh rate?

RamblaOptions.Default.MaxRefreshRate (default 60). Use the market dashboard demo's latency probe to find the knee for your workload — see Benchmarks.

What does the [State] generator emit?

One observable property per annotated field, routed through SetField (_bidBid). Nothing else in V1 — no DependsOn, commands, or validation. Diagnostics RMB001–RMB005 catch misuse (non-partial type, static/readonly field, name collision, not deriving RamblaState).

Clone this wiki locally