Repository navigation
Radical.Windows 4.0.0 moves to .NET 10 and Radical 3.0, adopts the async-only message broker, and removes APIs that have been obsolete since 2.x.
Follow the 3.x to 4.0.0 upgrade guide.
Breaking changes
.NET 10 is required
Radical.Windows 4.0.0 targets net10.0-windows only, so applications must target .NET 10 (#642). .NET 8 support ends on November 10, 2026.
Radical 3.0 and the async-only message broker
Radical.Windows 4.0.0 depends on Radical [3.0.0, 4.0.0), whose message broker is async-only (#663). Follow the async-only message broker upgrade guide, and its section for WPF and Avalonia applications.
- Subscribers return a
Task, standalone handlers implementHandleAsync, and publishers useDispatchAsyncandBroadcastAsync. RadicalApplication.Shutdown()is obsolete with an error: useawait RadicalApplication.ShutdownAsync(), which awaits theApplicationShutdownRequestedsubscribers before checking whether they canceled the shutdown.Shutdown()will be removed in 5.0.0 (#666).- The infrastructure's built-in messages, such as
ViewLoaded, are still broadcast fire-and-forget.
Radical 3.0 also removes members that were obsolete in 2.x, such as IRequireValidationCallback<T> and the As<T> extension methods: see the Radical 3.0.0 release notes.
Obsolete with an error
Code using these no longer compiles. They will be removed in 5.0.0.
ApplicationBootstrapperandApplicationBootstrapper<TMainView>: use theAddRadicalApplicationextension method (#649, removal in #655).ViewModelClosing: the infrastructure never published it. To cancel closing a view, implementIExpectViewClosingCallback(#660, removal in #659).RadicalApplication.Shutdown(), described above.
Removed APIs
| Removed | Replacement |
|---|---|
Repeat and Wait (#648) |
A DispatcherTimer |
AbstractViewModel.MoveFocusTo<T>(Expression<Func<T>>) and the AbstractMementoViewModel one (#653) |
MoveFocusTo(nameof(Property)) |
ObservableEntityCollection<T>.OnPropertyChanged<TValue>(Expression<Func<TValue>>) (#653) |
OnPropertyChanged(nameof(Property)) |
DelegateValidationService (#651) |
A class inheriting from AbstractValidationService that overrides OnValidate |
The IConventionsHandler.DefaultViewDataContextSearchBehavior setter (#652) |
None: the value is always ViewDataContextSearchBehavior.LocalOnly |
The http://schemas.topics.it/wpf/radical/windows/* XML namespaces (#650) |
The http://schemas.radicalframework.com/windows/* ones |
Validation is always enabled
AbstractViewModel and AbstractMementoViewModel implement IRequireValidation: setting a validation service is enough to enable validation (#318). View models without one use NullValidationService, which never reports errors.
New features
- Async commands:
DelegateCommandhas anOnExecute(Func<object, Task>)overload and anExecuteAsyncmethod, andAutoCommandBindingbinds view model methods returning aTask(#662). The command awaits the execution: while it runs, it can't execute again, so bound controls are disabled, and exceptions go to the application's unhandled exception handler. - Applications without a shell: the boot process documentation describes how to run without a main view (#654).
Full changelog: 3.0.0...4.0.0