Application framework
MVVMExpress
Modular MVVM for WPF — ViewModels, async state, Frame navigation, dialogs
Current NuGet 1.0.0
A modular MVVM framework for WPF on .NET 10: observable models, async commands, bindable AsyncState, lifecycle-aware cancellation, typed Frame navigation, dialogs, AdornerLayer toast, validation, pagination, forms, and a testing package. 1.0.0 is the first stable WPF family — independent of Plugin.Maui.MVVMExpress, with the same Core contract and no Shell host.
Install
dotnet add package Plugin.Wpf.MVVMExpress.Core
dotnet add package Plugin.Wpf.MVVMExpress
dotnet add package Plugin.Wpf.MVVMExpress.Navigation
dotnet add package Plugin.Wpf.MVVMExpress.DialogsPackage IDs: Plugin.Wpf.MVVMExpress.CorePlugin.Wpf.MVVMExpressPlugin.Wpf.MVVMExpress.NavigationPlugin.Wpf.MVVMExpress.Dialogs
Plugin.Wpf.MVVMExpress.* restores from nuget.org. CI also publishes GitHub Packages — see Use nuvyntralabs GitHub Packages from a C# project.
Or scaffold an app
dotnet new install Plugin.Wpf.MVVMExpress.Templates
dotnet new wpf-mvvmexpress -n MyAppAdds MainWindow with a Frame named NavigationHost, login replace-root, a list, a form, and tests. Then dotnet new wpf-mvvmexpress-page -n Catalog --namespace MyApp. Same commands from the VS Code and Visual Studio extensions.
Overview
WPF MVVMExpress is the application shell for production WPF apps on Windows. CommunityToolkit.Mvvm covers properties and commands, Prism covers regions, and ReactiveUI covers observable pipelines. A desktop app often needs all three plus bindable async state, lifecycle-aware cancellation, and typed Frame navigation — without taking three overlapping frameworks. Core targets net10.0 and does not reference WPF or MAUI. Host / Navigation / Dialogs target net10.0-windows10.0.17763.0. Current NuGet is 1.0.0. Scaffold with Plugin.Wpf.MVVMExpress.Templates (dotnet new wpf-mvvmexpress / wpf-mvvmexpress-page), or install the WPF MVVMExpress listings on the Visual Studio Code and Visual Studio Marketplaces. This is not Plugin.Maui.MVVMExpress: there is no PackageReference between the families. UseWpfMvvmExpress registers DispatcherMainThread and WpfWindowContext. UseFrameNavigation maps ViewModels onto a Frame named NavigationHost. UseAuth<TChallenge>() wraps GuardedNavigator. Toasts draw on AdornerLayer. Source generators, Reactive, Shell, UseDeepLinks, and UseSecureSessionAuth are out of 1.0.
Current release
- 1.0.0. First stable WPF family. Frame navigation, dialogs, validation, pagination, templates, and Visual Studio Code / Visual Studio wrappers.
- Templates and Marketplace IDE wrappers pin Plugin.Wpf.MVVMExpress.Templates 1.0.0.
- Independent of Plugin.Maui.MVVMExpress. Core contract aligns with MAUI 1.3; a ViewModel ports with a namespace swap. Breaking changes wait for 2.0.0.
Capabilities
- ObservableModel, ViewModel lifecycle, and ViewModelCancellationToken cancelled on dispose.
- Sync and async commands with UI-thread marshal, weak CanExecuteChanged, no-throw ICommand.Execute, timeout, retry, debounce, and throttle.
- UseWpfMvvmExpress + DispatcherMainThread + WpfWindowContext. Loaded / Unloaded lifecycle on navigated views.
- UseFrameNavigation + ResetAsync / ReplaceRootAsync on a Frame named NavigationHost. There is no Shell host.
- Navigators hop to IMainThread before constructing a Page or UserControl. Off-thread factories throw.
- Modal views open as owned Windows. One INavigator per Window — first-class multi-window.
- SectionHostView + SectionHostViewModel in-place tabs, SnapshotCollection load-once lists, MvvmSearch + SearchQuery.CommittedText.
- FormViewModel.Bind, WpfFormViewModel (INotifyDataErrorInfo), dirty confirm, SubmitAsync, MustMatch, undo/redo.
- UseAuth<TChallenge>() / AddAuth<TChallenge>() wraps GuardedNavigator. Register IAuthState yourself.
- WpfNotifier toast via AdornerLayer — never wraps Window.Content. Wrap the tree in AdornerDecorator.
- IModule / AddModule<T>() for feature-team registration.
- CoalescingDispatcher for inbox / hub handlers. IMainThread is the only marshal API in ViewModels.
- Testing package: LeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, ScopedNavigator.
- dotnet new wpf-mvvmexpress and wpf-mvvmexpress-page via Plugin.Wpf.MVVMExpress.Templates.
- VS Code (Create New App / Add Page) and Visual Studio 2022+ (Tools → WPF MVVMExpress; File → New → Project) Marketplace wrappers.
Documentation
Documentation
ViewModels, commands, DI, messaging, Frame navigation, modules, chat host, forms, project template, IDE extensions, and the shipped 1.0.0 roadmap.
Getting started
dotnet new wpf-mvvmexpress, VS Code or Visual Studio Marketplace extensions, install 1.0.0 into an existing app, first screen, UseFrameNavigation, Playground clone, FakeNavigator / LeakProbe, forms, and adapters.
Comparison
Surfaces, syntax map ([Notify] vs [ObservableProperty], INavigator vs INavigationService), trade-offs, and when to choose each.
IDE extensions
Install the WPF MVVMExpress listings on the Visual Studio Code and Visual Studio Marketplaces. Thin wrappers that install the template pack and run dotnet new.
Playground sample
Cloneable 15-minute path in the product repo — command, Frame navigation, dialog, form, auth, list, and a second window. Not a separate SampleApp repository.
Package family
| Package | Purpose | Status |
|---|---|---|
| Plugin.Wpf.MVVMExpress.CoreGitHub Packagesnuget.org | Observable model, commands, ViewModel, SectionHost, IModule, navigator/cache/auth abstractions, state, outcome, messaging | Implemented + tests |
| Plugin.Wpf.MVVMExpressGitHub Packagesnuget.org | UseWpfMvvmExpress, DispatcherMainThread, WpfWindowContext, Loaded/Unloaded lifecycle, SectionHostView, MvvmSearch, WpfFormViewModel | Implemented |
| Plugin.Wpf.MVVMExpress.NavigationGitHub Packagesnuget.org | WpfFrameNavigator, UseFrameNavigation, replace-root, owned-window modal stack | Implemented + tests |
| Plugin.Wpf.MVVMExpress.DialogsGitHub Packagesnuget.org | IDialogs + WpfDialogs (MessageBox) + WpfNotifier (AdornerLayer toast) | Implemented + tests |
| Plugin.Wpf.MVVMExpress.ValidationGitHub Packagesnuget.org | DataAnnotations + IValidator + MustMatch + ILLink trim roots | Implemented + tests |
| Plugin.Wpf.MVVMExpress.PaginationGitHub Packagesnuget.org | PagedCollection<T>, SnapshotCollection<T>, SearchQuery.CommittedText | Implemented + tests |
| Plugin.Wpf.MVVMExpress.TestingGitHub Packagesnuget.org | LeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, FakeMainThread, FakeConnectivity, FakeMessageHub, ScopedNavigator | Implemented + tests |
| Plugin.Wpf.MVVMExpress.TemplatesGitHub Packagesnuget.org | dotnet new wpf-mvvmexpress (app) and wpf-mvvmexpress-page (XAML + ViewModel + service) | Implemented |
Compose with
- Plugin.Maui.MVVMExpressThe MAUI family — same Core contract, different host. Do not add both PackageReferences to one project.
- Plugin.Maui.HttpForgeSource-generated typed REST client. Core is net10.0 — a WPF ViewModel can consume the same client library.
- CommunityToolkit.MvvmUsual WPF alternative when you only need properties and commands. Type names stay unique if both are referenced.
- WPF
- MVVM
- ViewModel
- C#
- Windows
- VS Code
- Visual Studio
Discussion
Comment on Plugin.Wpf.MVVMExpress. The thread lives on this component's GitHub repository (nuvyntralabs/Plugin.Wpf.MVVMExpress). Sign in with GitHub — Giscus uses Discussions, Utterances uses Issues.
Related in Application framework
- Plugin.Maui.MVVMExpressModular MVVM for MAUI — ViewModels, async state, Shell or NavigationPage, dialogs
- Plugin.Avalonia.MVVMExpressModular MVVM for Avalonia — ViewModels, async state, Frame host, dialogs
- Plugin.Uno.MVVMExpressModular MVVM for Uno Platform — ViewModels, async state, Frame navigation, dialogs