Skip to content
NLNuvyntra Labs

Application framework

MVVMExpress

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

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.0.0 SemVer lock — UseAuth, UseNavigationPage + replace-root, section host, snapshot lists.

Install

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

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

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. 1.0.0 is the SemVer lock: UseAuth<TChallenge>() wraps GuardedNavigator, pages are constructed on IMainThread, UseNavigationPage is the first-class login → replace-root → push host (Shell is optional), SectionHostViewModel switches 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; MVVMExpress composes them through adapters.

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 optional.
  • Navigators hop to IMainThread before new Page() or Shell.GoToAsync. Off-thread factories throw.
  • SectionHostViewModel in-place tabs, SnapshotCollection load-once lists, SearchQuery.CommittedText.
  • FormViewModel.Bind, dirty confirm, SubmitAsync, MustMatch, undo/redo.
  • UseAuth<TChallenge>() / AddAuth<TChallenge>() wraps GuardedNavigator. Register IAuthState (SecureSession in production).
  • MauiNotifier toast via Window.AddOverlay — never wraps Page.Content.
  • [Notify], command attributes, ModuleInitializer routes, [PersistState], and [RequiresAuth].
  • CoalescingDispatcher for inbox / hub handlers. IMainThread is the only marshal API in ViewModels.
  • Testing package: LeakProbe (including Button + pop page), ScaleProfile, FakeDialogs, FakeNavigator, ScopedNavigator.
  • Adapters for NetworkMonitor, ApiCache, OfflineSync, SecureSession, FormValidation, FeatureFlags, and DeepLinks.

Documentation

Package family

PackagePurposeStatus
Plugin.Maui.MVVMExpress.CoreObservable model, commands, ViewModel, SectionHost, navigator/cache/auth abstractions, state, outcome, messagingImplemented + tests
Plugin.Maui.MVVMExpressUseMvvmExpress, UseAuth, MauiMainThread, auto lifecycle, BusyOverlayBehavior, AsyncStateViewImplemented
Plugin.Maui.MVVMExpress.NavigationMauiShellNavigator + MauiPageNavigator, UseNavigationPage / UseShell, replace-rootImplemented + tests
Plugin.Maui.MVVMExpress.DialogsIDialogs + MauiDialogs + MauiNotifier (Window.AddOverlay toast)Implemented + tests
Plugin.Maui.MVVMExpress.ValidationDataAnnotations + IValidator + MustMatch + ILLink trim rootsImplemented + tests
Plugin.Maui.MVVMExpress.PaginationPagedCollection<T>, SnapshotCollection<T>, SearchQuery.CommittedTextImplemented + tests
Plugin.Maui.MVVMExpress.TestingLeakProbe, ScaleProfile, FakeDialogs, FakeNavigator, FakeMainThread, FakeConnectivity, FakeMessageHub, ScopedNavigatorImplemented + tests
Plugin.Maui.MVVMExpress.ReactiveIPropertyObservable / CombineLatest — no System.Reactive requiredImplemented + tests
Plugin.Maui.MVVMExpress.SourceGenerators[Notify], commands, register, routes, persist, authImplemented + snapshot tests
Plugin.Maui.MVVMExpress.Compatibility.CommunityToolkitCommunityToolkitMessageHub — IMessenger → IMessageHubImplemented + tests

Compose with