Releases: reactiveui/ReactiveUI
Release list
26.0.1
🗞️ What's Changed
🧹 General Changes
- 8831268 build(deps): update binding to 9.1.0 (#4533) @glennawatson
🔗 Full Changelog: 26.0.0...26.0.1
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
26.0.0
Summary
ReactiveUI 26.0.0 is a major version because the .NET 11 assemblies are built without runtime-async. The public API does not change.
Why runtime-async is off
- In .NET 10 and older, the C# compiler adds a state machine to each async method. The state machine stores the local variables and tracks where to resume after each
await. - .NET 11 adds a feature called runtime-async. The runtime does this work instead, so async code can run faster.
- ReactiveUI 25.x built the .NET 11 assemblies with runtime-async on. The .NET 8 to 10 and .NET Framework assemblies never used it.
- The feature needs a runtime that supports it. CoreCLR does, and Mono does not.
- Blazor WebAssembly runs on Mono unless you opt into CoreCLR. Avalonia's browser apps, WASI, Android API levels 21 to 23, and apps that set
UseMonoRuntime=truealso run on Mono. - ReactiveUI built with runtime-async can fail in every app that runs on Mono.
- A NuGet package ships one build for every runtime, so ReactiveUI leaves the feature off. This matches ReactiveUI.Binding 9.0.0 and Refit 16.0.0.
- Apps that target .NET 10 or older are not affected. Apps on .NET 11 that run on CoreCLR do not get the speed gain inside ReactiveUI's own async code.
- You can turn on runtime-async in your own app if it runs only on CoreCLR.
Other changes
- View
WhenActivatedis now trim and AOT safe. It watches the view'sViewModelthrough the registeredICreatesObservableForPropertyplugin, as the binding source generator does, instead of reflection. The[RequiresUnreferencedCode]attribute is gone from every viewWhenActivatedoverload, including the WPF ones, so views that callthis.WhenActivated(...)publish with Native AOT without trim warnings. - ReactiveUI.Binding is updated to 9.0.0. That release also fixes
BindCommandUnsafekeeping bindings it had replaced (reactiveui/ReactiveUI.Binding.SourceGenerators#163).
🗞️ What's Changed
🐛 Fixes
- 264b88c fix: make view WhenActivated trim and AOT safe; build without runtime-async (#4532) @glennawatson
🔗 Full Changelog: 25.1.1...26.0.0
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
25.1.1
🗞️ What's Changed
🧹 General Changes
- 9e5e699 build(deps): bump ReactiveUI.Binding to 8.8.0 (#4530) @glennawatson
📦 Dependencies
🔗 Full Changelog: 25.1.0...25.1.1
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
🤖 Automated services that contributed: renovate[bot]
25.1.0
🗞️ What's Changed
🧹 General Changes
- 6eef2f8 build(deps): bump ReactiveUI.Binding to 8.7.0 and ReactiveUI.Primitives to 8.4.0 (#4529) @glennawatson
📦 Dependencies
🔗 Full Changelog: 25.0.1...25.1.0
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
🤖 Automated services that contributed: renovate[bot]
25.0.1
Summary
ReactiveUI 25.0.1 adds back the ability to ask an interaction as an observable through IInteraction. ReactiveUI 25.0.0 removed it by accident.
IInteractionreturns.Handle(input) IObservable, as it did in ReactiveUI 24.Interactionreturns the question as an.WhenHandled(input) IObservable.new Interactionruns each handler on that scheduler, such as(handlerScheduler) RxSchedulers.MainThreadScheduler.Interactionstill returns.Handle(input) Task, 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.
🗞️ What's Changed
🧹 General Changes
- 3a1d270 build(deps): bump ReactiveUI.Binding to 8.6.0 (#4528) @glennawatson
🔗 Full Changelog: 25.0.0...25.0.1
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
25.0.0
Summary
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.
Binding moves to ReactiveUI.Binding
- Property observation and binding now run on ReactiveUI.Binding. It generates the code at build time, so it works with trimming and NativeAOT.
WhenAny*,WhenAnyValue,ObservableForProperty,Bind,OneWayBind,BindTo,BindCommand,InvokeCommand,BindInteraction,ToPropertyandObservableAsPropertyHelperkeep their names. They now come from ReactiveUI.Binding, which ReactiveUI brings in for you. Existingusing ReactiveUI;code keeps compiling.- If the generator cannot read a property path, use the matching
...Unsafeoverload. - ReactiveUI's old reflection-based observation and binding engine is removed. That is about 190,000 fewer lines, and far fewer trimming warnings.
- View location, view hosts, templates, routing, activation and validation presentation stay in ReactiveUI.
- The default view hosts on WPF, WinForms, WinUI, MAUI, Apple and Android find views without reflection and are AOT safe. Each has an
...Unsafetwin that also asks the service locator. - Routing reports navigation through plain observables of values.
- The migration guide lists the removed types, the behaviour changes and what to change in your code.
Source generators come with ReactiveUI
- ReactiveUI.Core now brings ReactiveUI.SourceGenerators. Both ReactiveUI and ReactiveUI.Reactive depend on Core, so every project gets the generators with no extra package.
[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.- If your project references an older ReactiveUI.SourceGenerators package directly, restore fails with NU1605. Remove that reference, or move it to 4.0.0 or later.
[ObservableAsProperty]and[IViewFor]now come from ReactiveUI.Binding.
New documentation and examples
- The documentation website at https://reactiveui.net/documentation/reactiveui and its related pages have been rewritten.
src/examples/Documentationhas 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.- Platform examples cover WPF, WinForms, WinUI, MAUI, Blazor, Android and Apple.
- These examples replace the old reactiveui/ReactiveUI.Samples repository, which is now archived.
Known issues
Interaction.HandlereturnsTaskinstead ofIObservable. This change was not intended.
Other changes
- Many bug fixes across Android, Apple, MAUI, WPF, WinUI, routing, suspension, the app builder and
ReactiveRecord. The full list is below. - Android and iOS device tests now run through
dotnet test --device.
🗞️ What's Changed
💥 Breaking Changes
- 37fa90a feat!: run property observation and binding on ReactiveUI.Binding (#4475) @glennawatson
- aba5bb2 feat!: bring ReactiveUI.SourceGenerators with ReactiveUI.Core (#4516) @glennawatson
- b0262cf refactor(builder)!: remove BuilderMixins members shadowed by IReactiveUIBuilder (#4498) @glennawatson
- 2a59e1d feat(routing)!: report navigation through plain observables of values (#4497) @glennawatson
- e267cca fix(winui)!: build the default item template without XAML type lookup (#4496) @glennawatson
- 6def5a6 fix!: make every default view host AOT safe on Binding 8.1.0 (#4505) @glennawatson
🐛 Fixes
- 1a39846 fix(maui): navigate from an empty RoutedViewHost and follow ViewModelViewHost contract changes (#4493) @glennawatson
- a579b33 fix(android): stop ServiceBound disposing the caller's context (#4514) @glennawatson
- a4baf2a fix: close first-read race in RxState, RxSuspension and RxCacheSize (#4519) @glennawatson
- f0074d3 fix(android): raise the view model change when it is set through IViewFor (#4513) @glennawatson
- 037a0f2 fix(android): return the display rotation from PlatformOperations.GetOrientation (#4495) @glennawatson
- 8eceb3c fix(apple): ignore lifecycle callbacks that arrive after dispose (#4523) @glennawatson
- 76926d8 fix(reactiverecord): keep notification state out of derived record ToString and equality (#4482) @glennawatson
- a9fb343 fix(routing): deliver scheduled notifications in order so Navigate returns its view model (#4484) @glennawatson
- 3d470f9 fix(android): skip the layout host's own View in opt-out wire-up (#4512) @glennawatson
- 8dcabad fix: honour ViewContract in WinUI ViewModelViewHost and add ReactiveWindowController (#4527) @glennawatson
- de754f8 fix(suspension): keep the suspension driver and pending load per host (#4483) @glennawatson
- 8ebe4a1 fix(wpf): raise TransitionCompleted once per transition (#4485) @glennawatson
- edc6355 fix(builder): keep the view locator's mappings and leave global state alone on a second build (#4490) @glennawatson
🧹 General Changes
- c9645bb build(deps): bump ReactiveUI.Binding to 8.3.0 (#4520) @glennawatson
- b049aa5 build(deps): bump TUnit to 1.69.16 (#4500) @glennawatson
- d86f9e5 build(deps): bump ReactiveUI.SourceGenerators to 4.2.0 (#4524) @glennawatson
- c6fa7ea build(deps): bump ReactiveUI.SourceGenerators to 4.0.1 (#4518) @glennawatson
- ec21eda build(deps): bump ReactiveUI.SourceGenerators to 4.1.0 (#4521) @glennawatson
- 92d5953 build(deps): bump ReactiveUI.Binding to 8.2.0 (#4515) @glennawatson
- 32746d8 build(deps): bump ReactiveUI.Binding to 8.4.0 (#4525) @glennawatson
- 1fcd23c chore: Delete .github/CODEOWNERS @glennawatson
✅ Tests
- dde34a2 test: add Android and iOS device tests run through dotnet test --device (#4506) @glennawatson
- f3c4b26 test: finish each dispatcher-thread test only after its teardown (#4501) @glennawatson
- 21fb115 test(wpf): stop the TransitioningContentControl tests waiting on WPF's render loop (#4499) @glennawatson
📝 Documentation
- 66e73a4 docs: add runnable documentation examples for the public API (#4503) @glennawatson
- 8ba04db docs(readme): add a Sponsors section @glennawatson
- 04209a0 docs: examples for the remaining public API, including Apple platforms (#4526) @glennawatson
- bbe16fa docs(examples): show default and Unsafe view hosts after #4505 (#4507) @glennawatson
🔗 Full Changelog: 24.3.0...25.0.0
🙌 Contributions
💖 Thanks to all the contributors: @glennawatson
24.3.0
🗞️ What's Changed
🐛 Fixes
- c63ed90 fix: use the Primitives main-thread sequencers for WPF, WinUI, WinForms and MAUI (#4474) @glennawatson @Pranay-Kumar-02
- 2712bd5 fix: add net8-11 -windows targets to the WPF, WinForms and Blend packages (#4472) @glennawatson @Pranay-Kumar-02
- 9e7839c fix(maui): register the MAUI platform module in WithMaui (#4471) @glennawatson
🧹 General Changes
- e36aa74 ci: pass sourceRef to the shared release workflow @glennawatson
- 2a2a42a chore(deps): update NuGet packages to their latest releases (#4470) @glennawatson
- ebc1778 chore: store the assets in git rather than LFS @glennawatson
- b91cdeb ci(lock): run the lock workflow at its own time of day @glennawatson
📝 Documentation
- 3a99baa docs: add security policy @glennawatson
- a3e8bd5 docs: point the code of conduct at the website @glennawatson
📦 Dependencies
🔗 Full Changelog: 24.2.0...24.3.0
🙌 Contributions
🌱 New contributors since the last release: @Pranay-Kumar-02
💖 Thanks to all the contributors: @glennawatson, @Pranay-Kumar-02
🤖 Automated services that contributed: renovate[bot]
24.2.0
🗞️ What's Changed
💥 Breaking Changes
- e740afe breaking: satisfy the analyzer gate across every target framework (#4432) @glennawatson
- 61276c3 fix(activation)!: let .Reactive blocks use System.Reactive DisposeWith (#4452) @glennawatson
♻️ Refactoring
- 1ff3262 refactor: keep one ComponentModelFallbackConverter for all platforms (#4435) @glennawatson
🐛 Fixes
- feeba90 fix(blazor): migrate to ReactiveUI.Primitives.Blazor (#4445) @ChrisPulman
- d2c79cf fix(build): hold the coverage collector at 18.10.0 (#4453) @glennawatson
🧹 General Changes
- 749b862 build: adopt PublicApiSharp.Analyzers for public API tracking (#4428) @glennawatson
📦 Dependencies
- a40188d chore(deps): update dependency roslynator.analyzers to v5 (#4449) renovate[bot]
- 7519172 chore(deps): update dependency roslynator.analyzers to 4.16.1 (#4446) renovate[bot]
- 7809fe8 chore(deps): update dependency microsoft.sourcelink.github to 10.0.400 (#4440) renovate[bot]
- e227460 chore(deps): update dependency microsoft.net.test.sdk to 18.9.0 (#4443) renovate[bot]
- efa283c chore(deps): update akavache to v13 (#4431) renovate[bot]
- 9ae1cdf chore(deps): update dependency microsoft.testing.extensions.codecoverage to 18.10.0 (#4441) renovate[bot]
- 74c209e chore(deps): update dependency sonaranalyzer.csharp to 10.32.0.713 (#4436) renovate[bot]
- fb166c2 chore(deps): update dependency microsoft.data.sqlite.core to 10.0.11 (#4439) renovate[bot]
- cb4ae6c chore(deps): update dependency microsoft.bcl.timeprovider to 10.0.11 (#4438) renovate[bot]
- fb8e0b1 chore(deps): update roslyn (microsoft.codeanalysis) to 5.9.0 (#4447) renovate[bot]
- bc719a2 chore(deps): update microsoft.windows (#4442) renovate[bot]
- 6a2ef8a chore(deps): update dependency sonaranalyzer.csharp to 10.33.0.1635 (#4448) renovate[bot]
- f085a55 chore(deps): update dependency roslynator.analyzers to 4.16.0 (#4433) renovate[bot]
🔗 Full Changelog: 24.1.0...24.2.0
🙌 Contributions
💖 Thanks to all the contributors: @ChrisPulman, @glennawatson
🤖 Automated services that contributed: renovate[bot]
24.1.0
🗞️ What's Changed
🐛 Fixes
- 07989b5 fix: broken links (#4422) @ptasznikarium
- 27ddca2 fix(testing): restore .NET Framework targets for the testing packages (#4427) @glennawatson
🧹 General Changes
- 27b0e3c chore(renovate): group related dependency cohorts (#4423) @glennawatson
- ad4b00c build: update nuget package dependencies (#4426) @glennawatson
🔗 Full Changelog: 24.0.0...24.1.0
🙌 Contributions
🌱 New contributors since the last release: @ptasznikarium
💖 Thanks to all the contributors: @glennawatson, @ptasznikarium
24.0.0
ReactiveUI 24.0.0
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.
Choose your distribution
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 |
| 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 |
New default: ReactiveUI.Primitives types
Keeping the existing package names selects the new default distribution. The normal ReactiveUI namespaces remain, but these public reactive types change:
System.Reactive.Concurrency.ISchedulerbecomesReactiveUI.Primitives.Concurrency.ISequencer.System.Reactive.UnitbecomesReactiveUI.Primitives.RxVoid.Subject,BehaviorSubject, andReplaySubjectbecomeSignal,BehaviorSignal, andReplaySignal.- System.Reactive is no longer a transitive dependency. ReactiveUI.Primitives provides Rx-style operators over
IObservable, so the default distribution does not require System.Reactive for observable composition. System.Reactive can still coexist with the default packages; choose the.Reactivefamily when you specifically want ReactiveUI APIs to use System.Reactive'sISchedulercompatibility seam (together withUnitand subject interop types).
Use System.Reactive schedulers with ReactiveUI: choose the .Reactive packages
Use 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.
Other changes to know about
- DynamicData integration moved out of core. Core routing types such as
RoutingState,IScreen, andRoutedViewHostremain in the main package. DynamicData-backed routing, change-set, collection, and auto-persist helpers now live inReactiveUI.Routing, orReactiveUI.Routing.Reactivefor the System.Reactive distribution. - Hot MVVM paths are substantially faster. Representative .NET 10 benchmarks showed roughly 3–4× faster
WhenAnyValue/ToPropertysubscription and emission, with 5–13× less allocation. Both distributions benefit because both run on Primitives. - AOT-friendly view activation was added. New
IActivatableView.WhenActivatedoverloads accept anIObservableViewModel-change source and avoid reflection and trim warnings. - .NET 11 preview targets were added and aligned. MAUI now targets supported .NET 10+ releases; the end-of-life .NET 9 MAUI targets were removed. Existing .NET 9 Windows/WinUI targets remain.
- Several correctness fixes are included.
WhenAnyValueno 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 pureObservableMixinshelpers work before builder initialization. - Platform fixes are included. WinForms design-mode detection works on .NET Core and for nested controls. The WPF
.Reactivepackage now resolves its XAML namespace and ships the default theme required byViewModelViewHost. - Two internal-looking public sink types were removed. Consumers of
ReactiveUI.Internal.SingleValueObservableorSyncExecuteObservableshould use the equivalentReactiveUI.Primitives.Advancedsignal types (ReturnSignalandStartSignal).
🗞️ What's Changed
💥 Breaking Changes
- 6433b00 refactor!: drop duplicate sinks for Primitives 5.7.0 concretes (#4387) @glennawatson
✨ Features
- 42b4cce feat: re-platform ReactiveUI onto ReactiveUI.Primitives — leaner, faster, System.Reactive optional (#4382) @glennawatson
- 2f34b56 feat: add AOT-friendly WhenActivated for IActivatableView (#4413) @glennawatson
♻️ Refactoring
- ff88f13 refactor(winui): share routed host setup (#4419) @glennawatson
- 873e9c3 refactor: consolidate duplicated reactive plumbing (#4418) @glennawatson
🐛 Fixes
- fed5931 fix: WaitForDispatcherScheduler marshals to UI thread from non-UI threads (fixes #4354) (#4361) @ChrisPulman @Copilot
- c18940e fix: use ObservableMixins helpers before RxAppBuilder initialization (#4410) @glennawatson
- 5a82114 fix(release): use empty MinVer tag prefix to match unprefixed tags @glennawatson
- 4a4efcf fix(wpf): resolve XAML namespace under REACTIVE_SHIM in AutoDataTemplateBindingHook (#4404) @deeferentleeg
- 9f1b734 fix(wpf): ship a default theme in ReactiveUI.WPF.Reactive so ViewModelViewHost renders (#4412) @glennawatson
- 2eb48f2 fix: resume interaction task handlers on the captured context (#4409) @glennawatson
- e5dbcfe fix: Winforms design mode detection regressed (#4369) @xackus
- d9133b6 fix: support .NET Core in winforms activation design mode check (#4358) @xackus
- 69586a4 Fix: WhenAnyValue subscribes to PropertyChanged before reading the initial value (#4381) @dwcullop
⚡ Performance
- 4680609 perf: use custom reactive sinks to improve allocations and performance (#4363) @glennawatson
🧹 General Changes
- 180a40b build: update package dependencies (#4417) @glennawatson
- b37934c ci(security): pin 3rd-party actions to commit SHAs (CodeQL actions/unpinned-tag) @glennawatson
- 2c6f400 build: allow stable packages with net11 previews @glennawatson
- 6dc538e chore: enable the expanded StyleSharp analyzer rule set and resolve all violations (#4385) @ChrisPulman @glennawatson
- 0a1a74e ci(release): grant packages:read so the release workflow can pull the signer image @glennawatson
- 3823cc3 ci(release): add alpha/beta/rc release channel (#4388) @glennawatson
- c9e11d4 chore(deps): update NuGet dependencies to latest (#4389) @glennawatson
- 4680756 ci(release): migrate signing from SSL.com eSigner to Certum SimplySign @glennawatson
- 9b92273 chore(deps): bump NuGet dependencies and drop EOL net9 MAUI targets (#4391) @glennawatson
- 1330c80 chore: Delete MERGE_FOLLOWUPS.md @glennawatson
- e6088d3 chore(deps): adopt the Sharp analyzer suite, update Primitives, modernize (#4414) @glennawatson
- 9fd2d8c chore: remove stray .dotnet-home template cache and gitignore it (#4371) @glennawatson
- 742cb4e ci(release): allow releasing from a historical ref @glennawatson