<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_MVVM_mit_dem_CommunityToolkit.Mvvm_statt_MvvmLight</id>
	<title>.NET MAUI: MVVM mit dem CommunityToolkit.Mvvm statt MvvmLight - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://techcorner.max-it.de/index.php?action=history&amp;feed=atom&amp;title=.NET_MAUI%3A_MVVM_mit_dem_CommunityToolkit.Mvvm_statt_MvvmLight"/>
	<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_MVVM_mit_dem_CommunityToolkit.Mvvm_statt_MvvmLight&amp;action=history"/>
	<updated>2026-10-17T10:12:39Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in maxTechCorner</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://techcorner.max-it.de/index.php?title=.NET_MAUI:_MVVM_mit_dem_CommunityToolkit.Mvvm_statt_MvvmLight&amp;diff=4307&amp;oldid=prev</id>
		<title>imported&gt;TechCorner-Redaktion: Neufassung von &quot;Xamarin MvvmLight-Binding funktioniert nicht&quot;: CommunityToolkit.Mvvm, Migrationstabelle</title>
		<link rel="alternate" type="text/html" href="https://techcorner.max-it.de/index.php?title=.NET_MAUI:_MVVM_mit_dem_CommunityToolkit.Mvvm_statt_MvvmLight&amp;diff=4307&amp;oldid=prev"/>
		<updated>2026-10-14T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;Neufassung von &amp;quot;Xamarin MvvmLight-Binding funktioniert nicht&amp;quot;: CommunityToolkit.Mvvm, Migrationstabelle&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Steckbrief&lt;br /&gt;
| gilt_fuer   = .NET MAUI 9/10, CommunityToolkit.Mvvm 8.x; Migration von MvvmLight (Xamarin)&lt;br /&gt;
| bereich     = Softwareentwicklung&lt;br /&gt;
| dauer       = ca. 30 Minuten (Einstieg), Migration je nach Projektgröße&lt;br /&gt;
| rechte      = Entwicklungsumgebung&lt;br /&gt;
| stand       = Oktober 2026&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MVVM in .NET MAUI&amp;#039;&amp;#039;&amp;#039; setzen Sie heute mit dem &amp;#039;&amp;#039;&amp;#039;CommunityToolkit.Mvvm&amp;#039;&amp;#039;&amp;#039; 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 &amp;lt;code&amp;gt;BindingContext&amp;lt;/code&amp;gt; der Seite, und das Toolkit erzeugt Eigenschaften und Befehle per Quellcode-Generator.&lt;br /&gt;
&lt;br /&gt;
[[Datei:NET-MAUI-MVVM-CommunityToolkit.png|thumb|center|750px|MVVM in .NET MAUI mit dem CommunityToolkit.Mvvm und die wichtigsten Entsprechungen beim Umstieg von MvvmLight.]]&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
* In einer Xamarin-App mit &amp;#039;&amp;#039;&amp;#039;MvvmLight&amp;#039;&amp;#039;&amp;#039; werden Daten nicht oder verspätet angezeigt; nach mehrfachem Navigieren reagieren Bindings doppelt oder gar nicht.&lt;br /&gt;
* MvvmLight wird seit 2021 nicht mehr weiterentwickelt und ist für .NET MAUI nicht vorgesehen.&lt;br /&gt;
&lt;br /&gt;
== Ursache ==&lt;br /&gt;
MvvmLight verwendete unter Xamarin.Android und Xamarin.iOS eigene Binding-Objekte, die je nach Lebenszyklus manuell gelöst werden mussten (&amp;lt;code&amp;gt;Detach()&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;OnStop&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;ViewDidDisappear&amp;lt;/code&amp;gt;). Wurde das vergessen, blieben Bindings am ViewModel hängen – mit Speicherlecks und doppelten Aktualisierungen. In .NET MAUI übernimmt das XAML-Binding-System diese Aufgabe.&lt;br /&gt;
&lt;br /&gt;
== Lösung: CommunityToolkit.Mvvm ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dotnet add package CommunityToolkit.Mvvm&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ViewModel ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
using CommunityToolkit.Mvvm.ComponentModel;&lt;br /&gt;
using CommunityToolkit.Mvvm.Input;&lt;br /&gt;
&lt;br /&gt;
public partial class AuftragViewModel : ObservableObject&lt;br /&gt;
{&lt;br /&gt;
    [ObservableProperty]&lt;br /&gt;
    [NotifyCanExecuteChangedFor(nameof(SpeichernCommand))]&lt;br /&gt;
    private string? kunde;&lt;br /&gt;
&lt;br /&gt;
    [ObservableProperty]&lt;br /&gt;
    private decimal betrag;&lt;br /&gt;
&lt;br /&gt;
    [RelayCommand(CanExecute = nameof(KannSpeichern))]&lt;br /&gt;
    private async Task SpeichernAsync()&lt;br /&gt;
    {&lt;br /&gt;
        await Task.Delay(500);   // z. B. Service-Aufruf&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private bool KannSpeichern() =&amp;gt; !string.IsNullOrWhiteSpace(Kunde);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Generator erzeugt die öffentlichen Eigenschaften &amp;lt;code&amp;gt;Kunde&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Betrag&amp;lt;/code&amp;gt; mit &amp;lt;code&amp;gt;PropertyChanged&amp;lt;/code&amp;gt; sowie den Befehl &amp;lt;code&amp;gt;SpeichernCommand&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Seite und Dependency Injection ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// MauiProgram.cs&lt;br /&gt;
builder.Services.AddTransient&amp;lt;AuftragViewModel&amp;gt;();&lt;br /&gt;
builder.Services.AddTransient&amp;lt;AuftragPage&amp;gt;();&lt;br /&gt;
&lt;br /&gt;
// AuftragPage.xaml.cs&lt;br /&gt;
public partial class AuftragPage : ContentPage&lt;br /&gt;
{&lt;br /&gt;
    public AuftragPage(AuftragViewModel vm)&lt;br /&gt;
    {&lt;br /&gt;
        InitializeComponent();&lt;br /&gt;
        BindingContext = vm;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;ContentPage ... x:DataType=&amp;quot;vm:AuftragViewModel&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;VerticalStackLayout Padding=&amp;quot;16&amp;quot; Spacing=&amp;quot;8&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;Entry Text=&amp;quot;{Binding Kunde}&amp;quot; Placeholder=&amp;quot;Kunde&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Entry Text=&amp;quot;{Binding Betrag}&amp;quot; Keyboard=&amp;quot;Numeric&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Button Text=&amp;quot;Speichern&amp;quot; Command=&amp;quot;{Binding SpeichernCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/VerticalStackLayout&amp;gt;&lt;br /&gt;
&amp;lt;/ContentPage&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Von MvvmLight umsteigen ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! MvvmLight !! CommunityToolkit.Mvvm&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ViewModelBase&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ObservableObject&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Set(ref feld, wert)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;RaisePropertyChanged()&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[ObservableProperty]&amp;lt;/code&amp;gt; bzw. &amp;lt;code&amp;gt;SetProperty(ref feld, wert)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RelayCommand&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RelayCommand&amp;lt;T&amp;gt;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[RelayCommand]&amp;lt;/code&amp;gt;, auch async mit &amp;lt;code&amp;gt;AsyncRelayCommand&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Messenger.Default&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WeakReferenceMessenger.Default&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SimpleIoc&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ViewModelLocator&amp;lt;/code&amp;gt; || Dependency Injection über &amp;lt;code&amp;gt;builder.Services&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SetBinding&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Detach()&amp;lt;/code&amp;gt; in Activity/ViewController || XAML-Binding über &amp;lt;code&amp;gt;BindingContext&amp;lt;/code&amp;gt;, kein manuelles Lösen&lt;br /&gt;
|-&lt;br /&gt;
| Xamarin.Forms &amp;lt;code&amp;gt;MessagingCenter&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WeakReferenceMessenger&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kompilierte Bindungen:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;x:DataType&amp;lt;/code&amp;gt; auf Seiten und DataTemplates setzen – Tippfehler in Bindungen fallen dann schon beim Build auf.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Messenger und Speicher:&amp;#039;&amp;#039;&amp;#039; Der &amp;lt;code&amp;gt;WeakReferenceMessenger&amp;lt;/code&amp;gt; hält Empfänger nur schwach; trotzdem Empfänger bei langlebigen Objekten mit &amp;lt;code&amp;gt;UnregisterAll(this)&amp;lt;/code&amp;gt; abmelden.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Plattformcode:&amp;#039;&amp;#039;&amp;#039; 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 &amp;lt;code&amp;gt;PropertyChanged&amp;lt;/code&amp;gt;-Ereignisse – an den passenden Lebenszyklus-Methoden an- und abmelden.&lt;br /&gt;
* Bei Architektur und Modernisierung Ihrer Apps unterstützt Sie die [https://www.max-it.de/development/individuelle-softwareentwicklung/ individuelle Softwareentwicklung von m.a.x. it].&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[.NET MAUI: Ladeanzeige mit ActivityIndicator]]&lt;br /&gt;
* [[Von Xamarin zu .NET MAUI migrieren]]&lt;br /&gt;
* [[Dependency Injection]]&lt;br /&gt;
* [[Lokale Funktionen in C-Sharp (Local Functions)]]&lt;br /&gt;
&lt;br /&gt;
== Links und Quellen ==&lt;br /&gt;
* [https://learn.microsoft.com/de-de/dotnet/communitytoolkit/mvvm/ Microsoft Learn: MVVM Toolkit (CommunityToolkit.Mvvm)]&lt;br /&gt;
* [https://www.max-it.de/development/individuelle-softwareentwicklung/ Individuelle Softwareentwicklung und App-Entwicklung von m.a.x. it]&lt;br /&gt;
&lt;br /&gt;
{{Uebermax}}&lt;br /&gt;
[[Kategorie:Softwareentwicklung]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;TechCorner-Redaktion</name></author>
	</entry>
</feed>