Skip to content
Nuvyntra Labs

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.Dialogs

Package 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 MyApp

Adds 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

Package family

PackagePurposeStatus
Plugin.Wpf.MVVMExpress.CoreGitHub Packagesnuget.orgObservable model, commands, ViewModel, SectionHost, IModule, navigator/cache/auth abstractions, state, outcome, messagingImplemented + tests
Plugin.Wpf.MVVMExpressGitHub Packagesnuget.orgUseWpfMvvmExpress, DispatcherMainThread, WpfWindowContext, Loaded/Unloaded lifecycle, SectionHostView, MvvmSearch, WpfFormViewModelImplemented
Plugin.Wpf.MVVMExpress.NavigationGitHub Packagesnuget.orgWpfFrameNavigator, UseFrameNavigation, replace-root, owned-window modal stackImplemented + tests
Plugin.Wpf.MVVMExpress.DialogsGitHub Packagesnuget.orgIDialogs + WpfDialogs (MessageBox) + WpfNotifier (AdornerLayer toast)Implemented + tests
Plugin.Wpf.MVVMExpress.ValidationGitHub Packagesnuget.orgDataAnnotations + IValidator + MustMatch + ILLink trim rootsImplemented + tests
Plugin.Wpf.MVVMExpress.PaginationGitHub Packagesnuget.orgPagedCollection<T>, SnapshotCollection<T>, SearchQuery.CommittedTextImplemented + tests
Plugin.Wpf.MVVMExpress.TestingGitHub Packagesnuget.orgLeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, FakeMainThread, FakeConnectivity, FakeMessageHub, ScopedNavigatorImplemented + tests
Plugin.Wpf.MVVMExpress.TemplatesGitHub Packagesnuget.orgdotnet new wpf-mvvmexpress (app) and wpf-mvvmexpress-page (XAML + ViewModel + service)Implemented

Compose with

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