Skip to content

4.0.0

Latest

Choose a tag to compare

@mauroservienti mauroservienti released this 01 Nov 15:02
· 2 commits to release-4.0 since this release
017ba00

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 implement HandleAsync, and publishers use DispatchAsync and BroadcastAsync.
  • RadicalApplication.Shutdown() is obsolete with an error: use await RadicalApplication.ShutdownAsync(), which awaits the ApplicationShutdownRequested subscribers 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.

  • ApplicationBootstrapper and ApplicationBootstrapper<TMainView>: use the AddRadicalApplication extension method (#649, removal in #655).
  • ViewModelClosing: the infrastructure never published it. To cancel closing a view, implement IExpectViewClosingCallback (#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: DelegateCommand has an OnExecute(Func<object, Task>) overload and an ExecuteAsync method, and AutoCommandBinding binds view model methods returning a Task (#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