NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
NuGet · #1860 most downloaded on NuGet
A MVVM framework that integrates with the Reactive Extensions for .NET to create elegant, testable User Interfaces that run on any mobile or desktop platform. This is the base package with the base platform implementations
Last release 7 days ago
04 Oct 2026
Release timing varies
gaps range from 8 days to 6 months
Rarely documented
notes for 12 of the last 60 stable releases
122 versions withdrawn
withdrawn after publishing
127 years old
300 releases · first in 1900
8831268 build(deps): update binding to 9.1.0 ( #4533 ) @glennawatson
🔗 Full Changelog: 26.0.0...26.0.1
💖 Thanks to all the contributors: @glennawatson
ReactiveUI 26.0.0 is a major version because the .NET 11 assemblies are built without runtime-async. The public API does not change.
One column per quarter.
ReactiveUI 26.0.0 is a major version because the .NET 11 assemblies are built without runtime-async. The public API does not change.
await.UseMonoRuntime=true also run on Mono.WhenActivated is now trim and AOT safe. It watches the view's ViewModel through the registered ICreatesObservableForProperty plugin, as the binding source generator does, instead of reflection. The [RequiresUnreferencedCode] attribute is gone from every view WhenActivated overload, including the WPF ones, so views that call this.WhenActivated(...) publish with Native AOT without trim warnings.BindCommandUnsafe keeping bindings it had replaced (reactiveui/ReactiveUI.Binding.SourceGenerators#163).🔗 Full Changelog: 25.1.1...26.0.0
💖 Thanks to all the contributors: @glennawatson
9e5e699 build(deps): bump ReactiveUI.Binding to 8.8.0 ( #4530 ) @glennawatson
🔗 Full Changelog: 25.1.0...25.1.1
💖 Thanks to all the contributors: @glennawatson
🤖 Automated services that contributed: renovate[bot]
6eef2f8 build(deps): bump ReactiveUI.Binding to 8.7.0 and ReactiveUI.Primitives to 8.4.0 ( #4529 ) @glennawatson
🔗 Full Changelog: 25.0.1...25.1.0
💖 Thanks to all the contributors: @glennawatson
🤖 Automated services that contributed: renovate[bot]
ReactiveUI 25.0.1 adds back the ability to ask an interaction as an observable through IInteraction<TInput, TOutput> . ReactiveUI 25.0.0 removed it by
ReactiveUI 25.0.1 adds back the ability to ask an interaction as an observable through IInteraction<TInput, TOutput>. ReactiveUI 25.0.0 removed it by accident.
IInteraction<TInput, TOutput>.Handle(input) returns IObservable<TOutput>, as it did in ReactiveUI 24.Interaction<TInput, TOutput>.WhenHandled(input) returns the question as an IObservable<TOutput>.new Interaction<TInput, TOutput>(handlerScheduler) runs each handler on that scheduler, such as RxSchedulers.MainThreadScheduler.Interaction<TInput, TOutput>.Handle(input) still returns Task<TOutput>, so code written against 25.0.0 keeps compiling.The change comes from ReactiveUI.Binding 8.6.0. The migration guide shows how to use each call.
🔗 Full Changelog: 25.0.0...25.0.1
💖 Thanks to all the contributors: @glennawatson
Most apps that use ReactiveObject and the usual binding calls keep compiling, but read the breaking changes below before you upgrade.
ReactiveUI 25.0.0 is a major version. Binding moves to a source-generator-first library, the ReactiveUI source generators now come with every install, and the documentation has been rebuilt. Most apps that use ReactiveObject and the usual binding calls keep compiling, but read the breaking changes below before you upgrade.
WhenAny*, WhenAnyValue, ObservableForProperty, Bind, OneWayBind, BindTo, BindCommand, InvokeCommand, BindInteraction, ToProperty and ObservableAsPropertyHelper<T> keep their names. They now come from ReactiveUI.Binding, which ReactiveUI brings in for you. Existing using ReactiveUI; code keeps compiling....Unsafe overload....Unsafe twin that also asks the service locator.[Reactive], [ReactiveCommand], [ReactiveCollection], [BindableDerivedList] and [IReactiveObject] generate your view model properties and commands at build time. This is now the recommended way to write view models.[ObservableAsProperty] and [IViewFor] now come from ReactiveUI.Binding.src/examples/Documentation has a runnable example for every public class and method, one project per website page. The website quotes these examples, and each one checks its printed output, so the docs stay in step with the code.Interaction.Handle returns Task<TOutput> instead of IObservable<TOutput>. This change was not intended.ReactiveRecord. The full list is below.dotnet test --device.🔗 Full Changelog: 24.3.0...25.0.0
💖 Thanks to all the contributors: @glennawatson
c63ed90 fix: use the Primitives main-thread sequencers for WPF, WinUI, WinForms and MAUI ( #4474 ) @glennawatson @Pranay-Kumar-02
🔗 Full Changelog: 24.2.0...24.3.0
🌱 New contributors since the last release: @Pranay-Kumar-02
💖 Thanks to all the contributors: @glennawatson, @Pranay-Kumar-02
🤖 Automated services that contributed: renovate[bot]
e740afe breaking: satisfy the analyzer gate across every target framework ( #4432 ) @glennawatson
🔗 Full Changelog: 24.1.0...24.2.0
💖 Thanks to all the contributors: @ChrisPulman, @glennawatson
🤖 Automated services that contributed: renovate[bot]
07989b5 fix: broken links ( #4422 ) @ptasznikarium
🔗 Full Changelog: 24.0.0...24.1.0
🌱 New contributors since the last release: @ptasznikarium
💖 Thanks to all the contributors: @glennawatson, @ptasznikarium
ReactiveUI 24 is a major release. ReactiveUI now runs on the allocation-conscious ReactiveUI.Primitives engine, with System.Reactive becoming optional
ReactiveUI 24 is a major release. ReactiveUI now runs on the allocation-conscious ReactiveUI.Primitives engine, with System.Reactive becoming optional. This changes public type identities and, for the System.Reactive-compatible distribution, namespaces, so review the migration path before upgrading.
Both distributions use the same ReactiveUI.Primitives engine, custom schedulers, and optimized sinks. Choose one package family consistently based on the reactive types you want in your public API.
| You want | Packages | Namespace | Public reactive types |
|---|---|---|---|
| The new lighter default | ReactiveUI, ReactiveUI.WPF, ReactiveUI.WinForms, ReactiveUI.WinUI, ReactiveUI.Maui, ReactiveUI.Blazor, ReactiveUI.AndroidX, etc. |
ReactiveUI |
RxVoid, ISequencer, Signal<T> |
| ReactiveUI APIs using System.Reactive schedulers | ReactiveUI.Reactive, ReactiveUI.WPF.Reactive, ReactiveUI.WinForms.Reactive, ReactiveUI.WinUI.Reactive, ReactiveUI.Maui.Reactive, ReactiveUI.Blazor.Reactive, etc. |
Primarily ReactiveUI.Reactive and ReactiveUI.Reactive.Builder |
Unit, IScheduler, Subject<T> |
Keeping the existing package names selects the new default distribution. The normal ReactiveUI namespaces remain, but these public reactive types change:
System.Reactive.Concurrency.IScheduler becomes ReactiveUI.Primitives.Concurrency.ISequencer.System.Reactive.Unit becomes ReactiveUI.Primitives.RxVoid.Subject<T>, BehaviorSubject<T>, and ReplaySubject<T> become Signal<T>, BehaviorSignal<T>, and ReplaySignal<T>.IObservable<T>, so the default distribution does not require System.Reactive for observable composition. System.Reactive can still coexist with the default packages; choose the .Reactive family when you specifically want ReactiveUI APIs to use System.Reactive's IScheduler compatibility seam (together with Unit and subject interop types)..Reactive packagesUse the .Reactive packages when you want ReactiveUI itself to accept and expose System.Reactive's IScheduler types. Merely referencing or using System.Reactive elsewhere does not require this distribution. Replace each ReactiveUI package with its matching .Reactive package; for example, use ReactiveUI.Reactive with ReactiveUI.WPF.Reactive instead of ReactiveUI with ReactiveUI.WPF.
The compatibility packages intentionally have distinct type identities. Most ReactiveUI APIs move from ReactiveUI to ReactiveUI.Reactive, builder APIs move to ReactiveUI.Reactive.Builder, and platform XAML/CLR namespace mappings may also need updating. This namespace change is part of why version 24 is a major release.
The .Reactive packages are not the old implementation: they use the same Primitives engine and performance work as the default packages, while exposing System.Reactive 7 types at the interop boundary.
RoutingState, IScreen, and RoutedViewHost remain in the main package. DynamicData-backed routing, change-set, collection, and auto-persist helpers now live in ReactiveUI.Routing, or ReactiveUI.Routing.Reactive for the System.Reactive distribution.WhenAnyValue/ToProperty subscription and emission, with 5–13× less allocation. Both distributions benefit because both run on Primitives.IActivatableView.WhenActivated overloads accept an IObservable<object?> ViewModel-change source and avoid reflection and trim warnings.WhenAnyValue no longer loses a concurrent first change, WPF main-thread scheduling now dispatches correctly from background threads, suspension state is materialized before shutdown persistence, interaction task handlers resume on the captured UI context, and pure ObservableMixins helpers work before builder initialization..Reactive package now resolves its XAML namespace and ships the default theme required by ViewModelViewHost.ReactiveUI.Internal.SingleValueObservable<T> or SyncExecuteObservable<T> should use the equivalent ReactiveUI.Primitives.Advanced signal types (ReturnSignal<T> and StartSignal<T>).🔗 Full Changelog: 23.2.28...24.0.0
🌱 New contributors since the last release: @deeferentleeg, @dwcullop
💖 Thanks to all the contributors: @ChrisPulman, @deeferentleeg, @dwcullop, @glennawatson, @xackus
🤖 Automated services that contributed: @Copilot, @renovate[bot]
Remove the deprecated integration tests; add modern samples, snippets, CI and docs
This is the recommended 23.x release. It supersedes and folds together 23.1.1, 23.1.8, 23.2.1, 23.2.19, and 23.2.27, which were signed with a code-signing certificate that has since been revoked — NuGet restore fails on them with NU3012. 23.2.28 is identical in code to 23.2.27 but re-signed with a valid certificate, and it depends on the re-signed Splat 19.4.1. Those superseded releases have been removed and their notes consolidated here.
DependencyProperty lookup (#4350, fixes #3921)BindCommand passing the wrong parameter after a new ViewModel is assigned to the View (#4324)ComponentModelFallbackConverter false positives + missing ConverterService registrations (#4313)WithWinForms() initialization + ReactiveCommand output-propagation tests (#4314)StackOverflow, activator negative ref-count, a binding regression, and testing extensions (#4301)WithCoreServices() and additional platform converters (#4316)23.2.27 source)19.4.1 (re-signed)🔗 Full Changelog: 22.3.1...23.2.28
💖 Thanks to all the contributors — @glennawatson, @ChrisPulman, @Copilot, and Maciej Walczak (see the linked PRs for attribution).
🤖 Automated services that contributed: @renovate[bot], @github-code-quality[bot]
What kind of change does this PR introduce?
Fix
Closes #4280
This pull request refactors the Interaction handler registration and
execution logic in ReactiveUI to improve consistency, reliability, and
testability, especially around asynchronous handler scenarios. It
introduces a unified handler registration core, ensures asynchronous
handlers yield to the current context, and updates tests to use modern
async/await patterns. Several new tests are also added to verify
scheduler release behavior for both task-based and observable handlers.
Core handler registration and async context improvements:
RegisterHandlerCore method to centralizeRegisterHandler overloads.YieldToCurrentContext method to ensure asynchronousTask and IObservable-based) yield execution beforeTest modernization and reliability:
InteractionsTest.cs to useasync/await and ToTask() instead of synchronous blockingWait()/FirstAsync().Wait()), improving test reliability and betterInteractionsTest class with [NotInParallel] to ensureExpanded test coverage for async handler behavior:
Task-based and IObservable-basedTest improvements for handler precedence and subscription timing:
TaskCompletionSource for precise subscriptionThese changes collectively make handler registration more robust,
improve async interaction patterns, and ensure that both the
implementation and test suite are future-proof and reliable.
main branchWhat kind of change does this PR introduce?
What kind of change does this PR introduce?
This PR fixes winforms designer serialization of ViewModelControlHost
and RoutedControlHost in ReactiveUI.WinForms.
What is the current behavior?
DesignerSerializationVisibility.Content causes multiple issues:
The object 'viewModelControlHost1' returned null for the property 'ViewModel' but this is not allowed when trying to save (observed onnet481).DefaultContent in the designer produces code that does notnet10.0-windows10.0.19041.0).There are similar issues with other properties.
The attribute also makes no sense on DefaultCacheViewsEnabled, because
it's a static property.
What is the new behavior?
Just turn off serialization for non-primitive properties.
This also makes things consistent with ReactiveUserControl.ViewModel.
Drop the attribute on DefaultCacheViewsEnabled.
What might this PR break?
This shouldn't break anything, the serialization did not work.
Please check if the PR fulfills these requirements
Other information:
Manual testing was performed on net481 and
net10.0-windows10.0.19041.0.
DesignerSerializationVisibility.Content was introduced in #3933,
probably because of a new analyzer error (WFO1000).
Before that change the properties defaulted to
DesignerSerializationVisibility.Visible, but that did not make sense
either.
The only property that could actually be set in the designer was
DefaultContent, but doing that resulted in a fatal
ObjectDisposedException when trying to reopen the designer.
Co-authored-by: Chris Pulman chris.pulman@yahoo.com
chore: Update version from 23.1 to 23.2.x
chore: Update version from 23.1 to 23.2.x
fix: resolve builder StackOverflow, activator negative refCount, bind…
fix: resolve builder StackOverflow, activator negative refCount, bind…
Nothing published for this version
22.3.1 Compare # Choose a tag to compare
22.3.1
Compare
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →