AOT-first property observation
ProMvvm
Observe changing view-model state without making reflection the default architecture.
Overview
A high-performance .NET MVVM property-observation library with generated typed paths, nested rewiring, ReactiveUI-compatible WhenAnyValue APIs, and no required reactive runtime.
ProMvvm makes typed property descriptors the fast path while retaining familiar expression APIs for incremental migration. Each subscription owns its notification chain, current-value emission, equality policy, and cleanup without requiring a global provider registry.
Generated, reflection-free property paths
Nested observation and automatic rewiring
ReactiveUI-compatible migration APIs
Trim-safe and NativeAOT-safe typed path
Built for
Where it fits.
- MVVM applications that need lightweight observable property streams
- ReactiveUI or CommunityToolkit.Mvvm teams adopting NativeAOT
- Library authors avoiding global service locators and runtime reflection
Compatibility & status
10.0
Typed APIs
Models + migration API
Generated properties
In the work
Real output,
not a mockup.

Architecture
Clear layers.
Replaceable seams.
Describe
Generated or handwritten property paths capture strongly typed getters and notification names.
Subscribe
Cold observable sinks attach directly to INotifyPropertyChanged or an explicit local adapter.
Rewire
Nested paths detach and reconnect when an intermediate object changes.
Compose
BCL IObservable results work directly or compose with optional System.Reactive operators.
Quick start
From package
to first frame.
Choose the package workflow used by your repository, then start from the smallest working example. Replace VERSION with the current stable or prerelease version shown on NuGet.
dotnet add package ProMvvm<PackageReference Include="ProMvvm" Version="VERSION" /><PackageVersion Include="ProMvvm" Version="VERSION" />[GeneratePropertyPaths]public partial class SearchViewModel : ObservableObject{ [ObservableProperty] private string _searchText = string.Empty;}
using var subscription = viewModel .WhenAnyValue(SearchViewModelPropertyPaths.SearchText) .Subscribe(Console.WriteLine);Package surface
Start focused.
Compose as needed.
Source, docs, samples, and releases
The repository is the source of truth.
Use the current documentation and samples, inspect changes, report issues, or support continued open-source maintenance.