Skip to content
Nuvyntra Labs

Application framework

MVVMExpress

Modular MVVM for MAUI — ViewModels, async state, Shell or NavigationPage, dialogs

Current NuGet 1.3.0

A modular MVVM framework for .NET MAUI on Android, iOS, Mac Catalyst, and Windows (single-window): observable models, async commands, bindable AsyncState, lifecycle-aware cancellation, typed Shell or NavigationPage navigation, dialogs, toast, validation, pagination, forms, Reactive, and source generators. 1.3.0 ships Phases 8–10 on the 1.0 SemVer lock — one registration path, analyzers, modules, modal stack, sibling host adapters, SectionHostView, MvvmSearch, and ILLink roots.

Install

dotnet add package Plugin.Maui.MVVMExpress.Core
dotnet add package Plugin.Maui.MVVMExpress

Package IDs: Plugin.Maui.MVVMExpress.CorePlugin.Maui.MVVMExpress

Plugin.Maui.* restores from GitHub Packages. Add the org feed first — see Use nuvyntralabs GitHub Packages from a C# project.

Or scaffold an app

dotnet new install Plugin.Maui.MVVMExpress.Templates
dotnet new mvvmexpress -n MyApp

Adds MainPage + MainPageViewModel, login replace-root, a list, a form, and tests. Then dotnet new mvvmexpress-page -n Catalog --namespace MyApp. Same commands from the VS Code and Visual Studio extensions.

Overview

MVVMExpress is the application shell for production MAUI apps on Android, iOS, Mac Catalyst, and Windows (single-window). CommunityToolkit.Mvvm covers properties and commands, Prism.Maui covers page navigation (not Shell), and ReactiveUI covers observable pipelines. A field or enterprise app often needs all three plus bindable async state, lifecycle-aware cancellation, and typed navigation — without taking three overlapping frameworks. Core targets net10.0 and does not reference MAUI. Current NuGet is 1.3.0: Phases 8–10 on the 1.0 SemVer lock. Scaffold with Plugin.Maui.MVVMExpress.Templates (dotnet new mvvmexpress / mvvmexpress-page), or install the MVVMExpress listings on the Visual Studio Code and Visual Studio Marketplaces — the extensions pin the same 1.3.0 pack. 1.0.0 remains the SemVer lock: UseAuth<TChallenge>() wraps GuardedNavigator, pages are constructed on IMainThread, UseNavigationPage and UseShell are equal hosts, generated [RegisterView] maps apply without a required Map callback, SectionHostView binds tabs in place, and SnapshotCollection loads a list once. Capability work (captive portal, HTTP cache, offline sync, form XAML, flags, deep links) stays in focused MauiEssentials plugins on Android and iOS; UseDeepLinks and UseSecureSessionAuth compose them and fail closed if the sibling is missing.

Current release

  • 1.3.0. Phases 8–10. One registration path, [NotifyDependsOn], analyzers, CommunityToolkit ViewModel interop, IModule / AddModule, modal stack, UseDeepLinks / UseSecureSessionAuth, SectionHostView, MvvmSearch, ILLink roots, 1.0 contract tests.
  • Templates and Marketplace IDE wrappers pin Plugin.Maui.MVVMExpress.Templates 1.3.0.
  • 1.0.0 remains the SemVer lock. Public 1.x APIs stay source-compatible. 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.
  • Host / Navigation / Dialogs on Android, iOS, Mac Catalyst, and Windows (single-window). Sibling adapters stay Android + iOS.
  • UseNavigationPage + ResetAsync / ReplaceRootAsync (replaces window.Page with a NavigationPage). UseShell is an equal host for flyout, tabs, and // routes.
  • Navigators hop to IMainThread before new Page() or Shell.GoToAsync. Off-thread factories throw. PushModalAsync / PopModalAsync on IPageNavigator.
  • SectionHostView + SectionHostViewModel in-place tabs, SnapshotCollection load-once lists, MvvmSearch + SearchQuery.CommittedText.
  • FormViewModel.Bind, dirty confirm, SubmitAsync, MustMatch, undo/redo.
  • UseAuth<TChallenge>() / AddAuth<TChallenge>() wraps GuardedNavigator. UseSecureSessionAuth() is the production adapter (fail closed).
  • UseDeepLinks() maps a URI onto INavigator, [Route], and the auth challenge. Missing sibling throws.
  • MauiNotifier toast via Window.AddOverlay — never wraps Page.Content.
  • [Notify], [NotifyDependsOn], [RegisterView] page maps, ModuleInitializer routes, [PersistState], and [RequiresAuth].
  • IModule / AddModule<T>() for feature-team registration. Convention scan is not a supported 1.3 path (MVVME010).
  • Analyzers MVVME001–003 and MVVME010–013 in the SourceGenerators pack.
  • CoalescingDispatcher for inbox / hub handlers. IMainThread is the only marshal API in ViewModels.
  • Testing package: LeakProbe (including Button + pop page), ScaleProfile, FakeDialogs, FakeNavigator, ScopedNavigator, 1.0 Contract.Tests.
  • Adapters for NetworkMonitor, ApiCache, OfflineSync, SecureSession, FormValidation, FeatureFlags, and DeepLinks.
  • dotnet new mvvmexpress and mvvmexpress-page via Plugin.Maui.MVVMExpress.Templates.
  • VS Code (Create New App / Add Page) and Visual Studio 2022+ (Tools → MVVMExpress; File → New → Project) Marketplace wrappers.

Documentation

Package family

PackagePurposeStatus
Plugin.Maui.MVVMExpress.CoreGitHub Packagesnuget.orgObservable model, commands, ViewModel, SectionHost, IModule, navigator/cache/auth abstractions, state, outcome, messagingImplemented + tests
Plugin.Maui.MVVMExpressGitHub Packagesnuget.orgUseMvvmExpress, UseAuth, UseDeepLinks, UseSecureSessionAuth, MauiMainThread, SectionHostView, MvvmSearch, auto lifecycle, BusyOverlayBehavior, AsyncStateViewImplemented
Plugin.Maui.MVVMExpress.NavigationGitHub Packagesnuget.orgMauiShellNavigator + MauiPageNavigator, UseNavigationPage / UseShell, replace-root, PushModalAsync / PopModalAsyncImplemented + tests
Plugin.Maui.MVVMExpress.DialogsGitHub Packagesnuget.orgIDialogs + MauiDialogs + MauiNotifier (Window.AddOverlay toast)Implemented + tests
Plugin.Maui.MVVMExpress.ValidationGitHub Packagesnuget.orgDataAnnotations + IValidator + MustMatch + ILLink trim rootsImplemented + tests
Plugin.Maui.MVVMExpress.PaginationGitHub Packagesnuget.orgPagedCollection<T>, SnapshotCollection<T>, SearchQuery.CommittedText, CollectionBind.AsyncFetchImplemented + tests
Plugin.Maui.MVVMExpress.TestingGitHub Packagesnuget.orgLeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, FakeMainThread, FakeConnectivity, FakeMessageHub, ScopedNavigatorImplemented + tests
Plugin.Maui.MVVMExpress.ReactiveGitHub Packagesnuget.orgIPropertyObservable / CombineLatest — no System.Reactive requiredImplemented + tests
Plugin.Maui.MVVMExpress.SourceGeneratorsGitHub Packagesnuget.org[Notify], [NotifyDependsOn], commands, register, routes, persist, auth, MVVME001–013 analyzersImplemented + snapshot tests
Plugin.Maui.MVVMExpress.Compatibility.CommunityToolkitGitHub Packagesnuget.orgCommunityToolkitMessageHub plus ObservableObject ViewModel interop (INavigator / IDialogs)Implemented + tests
Plugin.Maui.MVVMExpress.TemplatesGitHub Packagesnuget.orgdotnet new mvvmexpress (app) and mvvmexpress-page (XAML + ViewModel + service)Implemented

Compose with

Discussion

Comment on Plugin.Maui.MVVMExpress. The thread lives on this component's GitHub repository (nuvyntralabs/Plugin.Maui.MVVMExpress). Sign in with GitHub — Giscus uses Discussions, Utterances uses Issues.

Related in Application framework