Application framework
MVVMExpress
Modular MVVM for Uno Platform — ViewModels, async state, Frame navigation, dialogs
Current NuGet 1.0.1
A modular MVVM framework for Uno Platform on .NET 10: observable models, async commands, bindable AsyncState, lifecycle-aware cancellation, typed Frame navigation, ContentDialog, overlay toast, validation, pagination, forms, and a testing package. 1.0.0 is the first stable Uno family — independent of Plugin.Maui.MVVMExpress and Plugin.Wpf.MVVMExpress, with the same Core contract and no Shell host.
Install
dotnet add package Plugin.Uno.MVVMExpress.Core
dotnet add package Plugin.Uno.MVVMExpress
dotnet add package Plugin.Uno.MVVMExpress.Navigation
dotnet add package Plugin.Uno.MVVMExpress.DialogsPackage IDs: Plugin.Uno.MVVMExpress.CorePlugin.Uno.MVVMExpressPlugin.Uno.MVVMExpress.NavigationPlugin.Uno.MVVMExpress.Dialogs
Plugin.Uno.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.Uno.MVVMExpress.Templates
dotnet new uno-mvvmexpress -n MyAppAdds a main window with Frame named NavigationHost, login replace-root, a list, a form, and tests. Then dotnet new uno-mvvmexpress-page -n Catalog --namespace MyApp. Same commands from the VS Code and Visual Studio extensions.
Overview
Uno Platform MVVMExpress is the application shell for production Uno apps. CommunityToolkit.Mvvm covers properties and commands, Prism covers regions, and ReactiveUI covers observable pipelines. An Uno 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 Uno or MAUI. Host / Navigation / Dialogs target net10.0 and net10.0-desktop. Current NuGet is 1.0.1. Scaffold with Plugin.Uno.MVVMExpress.Templates (dotnet new uno-mvvmexpress / uno-mvvmexpress-page), or install the Uno MVVMExpress listings on the Visual Studio Code and Visual Studio Marketplaces. This is not Plugin.Maui.MVVMExpress or Plugin.Wpf.MVVMExpress: there is no PackageReference between the families. UseUnoMvvmExpress registers UnoDispatcherMainThread and UnoWindowContext. UseFrameNavigation maps ViewModels onto a Frame named NavigationHost. UseAuth<TChallenge>() wraps GuardedNavigator. Dialogs use ContentDialog. Toasts draw on an overlay — never Window.Content. Source generators, Reactive, Shell, UseDeepLinks, and UseSecureSessionAuth are out of 1.0.
Current release
- 1.0.1. Host / Navigation / Dialogs / Templates README files pack as real markdown so nuget.org renders them. IDE extensions pin the 1.0.1 template pack.
- 1.0.0. First stable Uno Platform family. Frame navigation, ContentDialog, overlay toasts, validation, pagination, templates, and Visual Studio Code / Visual Studio wrappers.
- Independent of Plugin.Maui.MVVMExpress and Plugin.Wpf.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.
- UseUnoMvvmExpress + UnoDispatcherMainThread + UnoWindowContext. 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. Off-thread factories throw.
- Modal views open as ContentDialog. One INavigator per Window — first-class multi-window.
- SectionHostView + SectionHostViewModel in-place tabs, SnapshotCollection load-once lists, MvvmSearch + SearchQuery.CommittedText.
- FormViewModel.Bind, UnoFormViewModel (INotifyDataErrorInfo), dirty confirm, SubmitAsync, MustMatch, undo/redo.
- UseAuth<TChallenge>() / AddAuth<TChallenge>() wraps GuardedNavigator. Register IAuthState yourself.
- UnoNotifier toast via overlay — never wraps Window.Content.
- 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 uno-mvvmexpress and uno-mvvmexpress-page via Plugin.Uno.MVVMExpress.Templates.
- VS Code (Create New App / Add Page) and Visual Studio 2022+ (Tools → Uno 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 uno-mvvmexpress, VS Code or Visual Studio Marketplace extensions, install 1.0.1 into an existing app, first screen, UseFrameNavigation, Playground clone, FakeNavigator / LeakProbe, and forms.
Comparison
Surfaces, syntax map ([Notify] vs [ObservableProperty], INavigator vs INavigationService), trade-offs, and when to choose each.
IDE extensions
Install the Uno Platform 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.Uno.MVVMExpress.CoreGitHub Packagesnuget.org | Observable model, commands, ViewModel, SectionHost, IModule, navigator/cache/auth abstractions, state, outcome, messaging | Implemented + tests |
| Plugin.Uno.MVVMExpressGitHub Packagesnuget.org | UseUnoMvvmExpress, UnoDispatcherMainThread, UnoWindowContext, Loaded/Unloaded lifecycle, SectionHostView, MvvmSearch, UnoFormViewModel | Implemented |
| Plugin.Uno.MVVMExpress.NavigationGitHub Packagesnuget.org | UnoFrameNavigator, UseFrameNavigation, replace-root, ContentDialog modal stack | Implemented + tests |
| Plugin.Uno.MVVMExpress.DialogsGitHub Packagesnuget.org | IDialogs + UnoDialogs (ContentDialog) + UnoNotifier (overlay toast) | Implemented + tests |
| Plugin.Uno.MVVMExpress.ValidationGitHub Packagesnuget.org | DataAnnotations + IValidator + MustMatch + ILLink trim roots | Implemented + tests |
| Plugin.Uno.MVVMExpress.PaginationGitHub Packagesnuget.org | PagedCollection<T>, SnapshotCollection<T>, SearchQuery.CommittedText | Implemented + tests |
| Plugin.Uno.MVVMExpress.TestingGitHub Packagesnuget.org | LeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, FakeMainThread, FakeConnectivity, FakeMessageHub, ScopedNavigator | Implemented + tests |
| Plugin.Uno.MVVMExpress.TemplatesGitHub Packagesnuget.org | dotnet new uno-mvvmexpress (app) and uno-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.Wpf.MVVMExpressThe WPF family — same Core contract, different host. A ViewModel ports with a namespace swap.
- Plugin.Maui.HttpForgeSource-generated typed REST client. Core is net10.0 — a desktop ViewModel can consume the same client library.
- CommunityToolkit.MvvmUsual alternative when you only need properties and commands. Type names stay unique if both are referenced.
- Uno Platform
- WinUI
- MVVM
- ViewModel
- C#
- Windows
- VS Code
- Visual Studio
Discussion
Comment on Plugin.Uno.MVVMExpress. The thread lives on this component's GitHub repository (nuvyntralabs/Plugin.Uno.MVVMExpress). Sign in with GitHub — Giscus uses Discussions, Utterances uses Issues.