.NET MAUI: MVVM mit dem CommunityToolkit.Mvvm statt MvvmLight

Aus maxTechCorner

Auf einen Blick

Gilt für.NET MAUI 9/10, CommunityToolkit.Mvvm 8.x; Migration von MvvmLight (Xamarin)
BereichSoftwareentwicklung
Dauerca. 30 Minuten (Einstieg), Migration je nach Projektgröße
RechteEntwicklungsumgebung
StandOktober 2026

MVVM in .NET MAUI setzen Sie heute mit dem CommunityToolkit.Mvvm um – dem offiziellen Nachfolger von MvvmLight. Die früher unter Xamarin typischen Probleme mit MvvmLight-Bindings, die beim Navigieren „hängen bleiben“ oder Daten verspätet anzeigen, entfallen: .NET MAUI bindet über den BindingContext der Seite, und das Toolkit erzeugt Eigenschaften und Befehle per Quellcode-Generator.

MVVM in .NET MAUI mit dem CommunityToolkit.Mvvm und die wichtigsten Entsprechungen beim Umstieg von MvvmLight.

Problem

  • In einer Xamarin-App mit MvvmLight werden Daten nicht oder verspätet angezeigt; nach mehrfachem Navigieren reagieren Bindings doppelt oder gar nicht.
  • MvvmLight wird seit 2021 nicht mehr weiterentwickelt und ist für .NET MAUI nicht vorgesehen.

Ursache

MvvmLight verwendete unter Xamarin.Android und Xamarin.iOS eigene Binding-Objekte, die je nach Lebenszyklus manuell gelöst werden mussten (Detach() in OnStop bzw. ViewDidDisappear). Wurde das vergessen, blieben Bindings am ViewModel hängen – mit Speicherlecks und doppelten Aktualisierungen. In .NET MAUI übernimmt das XAML-Binding-System diese Aufgabe.

Lösung: CommunityToolkit.Mvvm

dotnet add package CommunityToolkit.Mvvm

ViewModel

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

public partial class AuftragViewModel : ObservableObject
{
    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(SpeichernCommand))]
    private string? kunde;

    [ObservableProperty]
    private decimal betrag;

    [RelayCommand(CanExecute = nameof(KannSpeichern))]
    private async Task SpeichernAsync()
    {
        await Task.Delay(500);   // z. B. Service-Aufruf
    }

    private bool KannSpeichern() => !string.IsNullOrWhiteSpace(Kunde);
}

Der Generator erzeugt die öffentlichen Eigenschaften Kunde und Betrag mit PropertyChanged sowie den Befehl SpeichernCommand.

Seite und Dependency Injection

// MauiProgram.cs
builder.Services.AddTransient<AuftragViewModel>();
builder.Services.AddTransient<AuftragPage>();

// AuftragPage.xaml.cs
public partial class AuftragPage : ContentPage
{
    public AuftragPage(AuftragViewModel vm)
    {
        InitializeComponent();
        BindingContext = vm;
    }
}
<ContentPage ... x:DataType="vm:AuftragViewModel">
    <VerticalStackLayout Padding="16" Spacing="8">
        <Entry Text="{Binding Kunde}" Placeholder="Kunde" />
        <Entry Text="{Binding Betrag}" Keyboard="Numeric" />
        <Button Text="Speichern" Command="{Binding SpeichernCommand}" />
    </VerticalStackLayout>
</ContentPage>

Von MvvmLight umsteigen

MvvmLight CommunityToolkit.Mvvm
ViewModelBase ObservableObject
Set(ref feld, wert) / RaisePropertyChanged() [ObservableProperty] bzw. SetProperty(ref feld, wert)
RelayCommand, RelayCommand<T> [RelayCommand], auch async mit AsyncRelayCommand
Messenger.Default WeakReferenceMessenger.Default
SimpleIoc / ViewModelLocator Dependency Injection über builder.Services
SetBinding/Detach() in Activity/ViewController XAML-Binding über BindingContext, kein manuelles Lösen
Xamarin.Forms MessagingCenter WeakReferenceMessenger

Hinweise

  • Kompilierte Bindungen: x:DataType auf Seiten und DataTemplates setzen – Tippfehler in Bindungen fallen dann schon beim Build auf.
  • Messenger und Speicher: Der WeakReferenceMessenger hält Empfänger nur schwach; trotzdem Empfänger bei langlebigen Objekten mit UnregisterAll(this) abmelden.
  • Plattformcode: Wer in .NET for Android/iOS ohne XAML arbeitet, kann das Toolkit für ViewModels ebenfalls nutzen; die Bindung an native Controls erfolgt dann über PropertyChanged-Ereignisse – an den passenden Lebenszyklus-Methoden an- und abmelden.
  • Bei Architektur und Modernisierung Ihrer Apps unterstützt Sie die individuelle Softwareentwicklung von m.a.x. it.

Siehe auch

Links und Quellen


Über m.a.x. it Die m.a.x. Informationstechnologie AG ist seit über 30 Jahren IT-Partner mittelständischer und großer Unternehmen in München und bietet maßgeschneiderte Lösungen und Services in den Bereichen Cloud, Cybersecurity, Netzwerk, Windows, Linux und Softwareentwicklung. Sie haben eine Frage zu diesem Artikel oder brauchen Unterstützung? Kontakt aufnehmen