<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Model-View-ViewModel_%28MVVM%29</id>
	<title>Model-View-ViewModel (MVVM) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Model-View-ViewModel_%28MVVM%29"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Model-View-ViewModel_(MVVM)&amp;action=history"/>
	<updated>2026-05-09T11:21:21Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Model-View-ViewModel_(MVVM)&amp;diff=90&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „= Model-View-ViewModel (MVVM) Entwurfsmuster =  Das &#039;&#039;&#039;Model-View-ViewModel&#039;&#039;&#039;-Muster (kurz: &#039;&#039;&#039;MVVM&#039;&#039;&#039;) ist ein Architekturmuster, das aus dem MVP-Muster hervorgegangen ist.   Es wurde ursprünglich von Microsoft für das Framework &#039;&#039;&#039;WPF (Windows Presentation Foundation)&#039;&#039;&#039; entwickelt und wird heute in vielen modernen UI-Frameworks verwendet – etwa in **MAUI**, **Xamarin**, **Angular**, **Vue.js** und **Bl…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Model-View-ViewModel_(MVVM)&amp;diff=90&amp;oldid=prev"/>
		<updated>2025-11-01T11:43:45Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „= Model-View-ViewModel (MVVM) Entwurfsmuster =  Das &amp;#039;&amp;#039;&amp;#039;Model-View-ViewModel&amp;#039;&amp;#039;&amp;#039;-Muster (kurz: &amp;#039;&amp;#039;&amp;#039;MVVM&amp;#039;&amp;#039;&amp;#039;) ist ein Architekturmuster, das aus dem &lt;a href=&quot;/index.php?title=Model-View-Presenter_(MVP)_Entwurfsmuster&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Model-View-Presenter (MVP) Entwurfsmuster (Seite nicht vorhanden)&quot;&gt;MVP-Muster&lt;/a&gt; hervorgegangen ist.   Es wurde ursprünglich von Microsoft für das Framework &amp;#039;&amp;#039;&amp;#039;WPF (Windows Presentation Foundation)&amp;#039;&amp;#039;&amp;#039; entwickelt und wird heute in vielen modernen UI-Frameworks verwendet – etwa in **MAUI**, **Xamarin**, **Angular**, **Vue.js** und **Bl…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Model-View-ViewModel (MVVM) Entwurfsmuster =&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Model-View-ViewModel&amp;#039;&amp;#039;&amp;#039;-Muster (kurz: &amp;#039;&amp;#039;&amp;#039;MVVM&amp;#039;&amp;#039;&amp;#039;) ist ein Architekturmuster, das aus dem [[Model-View-Presenter (MVP) Entwurfsmuster|MVP-Muster]] hervorgegangen ist.  &lt;br /&gt;
Es wurde ursprünglich von Microsoft für das Framework &amp;#039;&amp;#039;&amp;#039;WPF (Windows Presentation Foundation)&amp;#039;&amp;#039;&amp;#039; entwickelt und wird heute in vielen modernen UI-Frameworks verwendet – etwa in **MAUI**, **Xamarin**, **Angular**, **Vue.js** und **Blazor**.  &lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, **Benutzeroberfläche, Logik und Daten** konsequent zu trennen und gleichzeitig eine **automatische Synchronisierung** zwischen View und Datenmodell durch **Datenbindung (Data Binding)** zu ermöglichen.&lt;br /&gt;
&lt;br /&gt;
== Grundidee ==&lt;br /&gt;
&lt;br /&gt;
MVVM teilt eine Anwendung in drei Schichten:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponente !! Aufgabe&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Model&amp;#039;&amp;#039;&amp;#039; || Enthält die Daten und Geschäftslogik.  &lt;br /&gt;
Definiert, wie Daten gespeichert, verarbeitet und validiert werden.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;View&amp;#039;&amp;#039;&amp;#039; || Stellt die Benutzerschnittstelle dar.  &lt;br /&gt;
Zeigt die Daten aus dem ViewModel an und sendet Benutzerinteraktionen zurück.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;ViewModel&amp;#039;&amp;#039;&amp;#039; || Vermittelt zwischen View und Model.  &lt;br /&gt;
Bereitet Daten auf, stellt Bindungsfelder bereit und reagiert auf Änderungen.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+--------------+         +----------------+         +--------------+&lt;br /&gt;
|    View      | &amp;lt;-----&amp;gt; |   ViewModel    | &amp;lt;-----&amp;gt; |    Model     |&lt;br /&gt;
| (Anzeige)    |  Binding| (Logik + State)|         | (Daten)      |&lt;br /&gt;
+--------------+         +----------------+         +--------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hauptprinzip ==&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;ViewModel&amp;#039;&amp;#039;&amp;#039; ist das Bindeglied zwischen der Oberfläche (View) und der Logik (Model).  &lt;br /&gt;
Es stellt **Eigenschaften** und **Befehle (Commands)** bereit, an die die View **gebunden (bound)** wird.  &lt;br /&gt;
Wenn sich der Wert im Model ändert, wird die View automatisch aktualisiert – und umgekehrt.&lt;br /&gt;
&lt;br /&gt;
== Ablauf ==&lt;br /&gt;
1. Die **View** bindet ihre Steuerelemente an Eigenschaften und Befehle des ViewModels.  &lt;br /&gt;
2. Das **ViewModel** verwaltet den Anwendungszustand und kommuniziert mit dem Model.  &lt;br /&gt;
3. Das **Model** speichert die Daten und führt Geschäftslogik aus.  &lt;br /&gt;
4. Änderungen werden über das Bindungssystem automatisch synchronisiert.&lt;br /&gt;
&lt;br /&gt;
== Beispiel (C# / Pseudocode) ==&lt;br /&gt;
Ein einfaches MVVM-Beispiel in C#-ähnlicher Syntax:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// --- Model ---&lt;br /&gt;
public class User {&lt;br /&gt;
    public string Name { get; set; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --- ViewModel ---&lt;br /&gt;
using System.ComponentModel;&lt;br /&gt;
using System.Runtime.CompilerServices;&lt;br /&gt;
using System.Windows.Input;&lt;br /&gt;
&lt;br /&gt;
public class UserViewModel : INotifyPropertyChanged {&lt;br /&gt;
    private User user = new User();&lt;br /&gt;
&lt;br /&gt;
    public string Name {&lt;br /&gt;
        get =&amp;gt; user.Name;&lt;br /&gt;
        set {&lt;br /&gt;
            user.Name = value;&lt;br /&gt;
            OnPropertyChanged();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public ICommand SaveCommand { get; }&lt;br /&gt;
&lt;br /&gt;
    public UserViewModel() {&lt;br /&gt;
        SaveCommand = new RelayCommand(Save);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    private void Save() {&lt;br /&gt;
        Console.WriteLine($&amp;quot;Benutzer {Name} wurde gespeichert.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public event PropertyChangedEventHandler PropertyChanged;&lt;br /&gt;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)&lt;br /&gt;
        =&amp;gt; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**View (XAML-Beispiel):**&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;StackPanel&amp;gt;&lt;br /&gt;
    &amp;lt;TextBox Text=&amp;quot;{Binding Name, UpdateSourceTrigger=PropertyChanged}&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;Button Content=&amp;quot;Speichern&amp;quot; Command=&amp;quot;{Binding SaveCommand}&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/StackPanel&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**Ergebnis:**  &lt;br /&gt;
Wenn der Benutzer den Text ändert, wird automatisch die `Name`-Eigenschaft im ViewModel aktualisiert.  &lt;br /&gt;
Beim Klick auf den Button wird der `SaveCommand` ausgeführt – ohne dass die View Code-Behind-Logik benötigt.&lt;br /&gt;
&lt;br /&gt;
== Vorteile ==&lt;br /&gt;
* **Starke Entkopplung** zwischen Logik und Darstellung  &lt;br /&gt;
* **Automatische Synchronisierung** durch Datenbindung  &lt;br /&gt;
* **Hohe Testbarkeit** (ViewModel kann unabhängig von der UI getestet werden)  &lt;br /&gt;
* **Wiederverwendbarkeit** von ViewModels mit verschiedenen Views  &lt;br /&gt;
* Ideal für moderne UI-Frameworks mit **Binding-System**&lt;br /&gt;
&lt;br /&gt;
== Nachteile ==&lt;br /&gt;
* Erhöhter Initialaufwand durch Implementierung von Bindings und PropertyChanged  &lt;br /&gt;
* Kann bei großen Projekten komplex werden  &lt;br /&gt;
* Erfordert Framework-Unterstützung (Bindings, Commands)&lt;br /&gt;
&lt;br /&gt;
== Typische Verwendung ==&lt;br /&gt;
* GUI-Frameworks mit Datenbindung:&lt;br /&gt;
  * **WPF** und **MAUI** (C# / .NET)&lt;br /&gt;
  * **Xamarin.Forms**&lt;br /&gt;
  * **Blazor**&lt;br /&gt;
  * **Angular**, **Vue.js**, **React** (konzeptionell ähnlich)&lt;br /&gt;
* Mobile-Apps (Cross-Plattform)&lt;br /&gt;
* Client-seitige Webanwendungen (SPAs)&lt;br /&gt;
&lt;br /&gt;
== Unterschiede zu MVC und MVP ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Merkmal !! MVC !! MVP !! MVVM&lt;br /&gt;
|-&lt;br /&gt;
| Verbindung Model–View || Möglich || Über Presenter || Über ViewModel mit Bindings&lt;br /&gt;
|-&lt;br /&gt;
| Kommunikation || View ↔ Controller ↔ Model || View ↔ Presenter ↔ Model || View ⇄ ViewModel ⇄ Model&lt;br /&gt;
|-&lt;br /&gt;
| Datenbindung || Manuell || Teilweise || Automatisch&lt;br /&gt;
|-&lt;br /&gt;
| Testbarkeit || Gut || Sehr gut || Sehr gut&lt;br /&gt;
|-&lt;br /&gt;
| Framework-Support || Universal || GUI-basiert || Frameworks mit Binding-System&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispielhafte Implementierungen ==&lt;br /&gt;
* **C# / .NET:** WPF, UWP, MAUI, Xamarin.Forms  &lt;br /&gt;
* **JavaScript:** Vue.js, Angular, React (Hooks/State ≈ ViewModel)  &lt;br /&gt;
* **C++ / Qt:** QML-View mit C++-Backend  &lt;br /&gt;
* **Swift / iOS:** SwiftUI (State und ViewModel-Konzept)&lt;br /&gt;
&lt;br /&gt;
== Vergleich zu ähnlichen Mustern ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Muster !! Fokus !! Besonderheit&lt;br /&gt;
|-&lt;br /&gt;
| [[Model-View-Controller (MVC) Entwurfsmuster]] || Strikte Trennung von Logik und Darstellung || Controller steuert Model und View&lt;br /&gt;
|-&lt;br /&gt;
| [[Model-View-Presenter (MVP) Entwurfsmuster]] || Presenter vermittelt aktiv zwischen View und Model || Kein automatisches Binding&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Model-View-ViewModel (MVVM)&amp;#039;&amp;#039;&amp;#039; || Datenbindung zwischen View und Logik || Automatische Synchronisierung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Vorteile gegenüber MVP ==&lt;br /&gt;
* Weniger Code durch Binding-Mechanismen  &lt;br /&gt;
* ViewModel kennt die View nicht direkt  &lt;br /&gt;
* Verbesserte Wiederverwendbarkeit und Testbarkeit  &lt;br /&gt;
&lt;br /&gt;
== Nachteile gegenüber MVP ==&lt;br /&gt;
* Bindings sind frameworkabhängig  &lt;br /&gt;
* Debugging von Bindings oft schwieriger  &lt;br /&gt;
* Höherer Speicher-Overhead bei komplexen Bindungsstrukturen  &lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Model-View-Controller (MVC) Entwurfsmuster]]&lt;br /&gt;
* [[Model-View-Presenter (MVP) Entwurfsmuster]]&lt;br /&gt;
* [[Event-Driven Architecture]]&lt;br /&gt;
* [[Observer-Entwurfsmuster]]&lt;br /&gt;
* [[Data Binding]]&lt;br /&gt;
* [[Entwurfsmuster (Softwareentwicklung)]]&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
* John Gossman (Microsoft): *Introduction to Model-View-ViewModel (2005)*  &lt;br /&gt;
* Erich Gamma et al.: *Design Patterns – Elements of Reusable Object-Oriented Software*  &lt;br /&gt;
* [https://learn.microsoft.com/en-us/dotnet/desktop/wpf/data/?view=netdesktop-8.0 Microsoft Docs: Data Binding in WPF]  &lt;br /&gt;
* [https://martinfowler.com/eaaDev/PresentationModel.html Martin Fowler: Presentation Model]  &lt;br /&gt;
* [https://en.wikipedia.org/wiki/Model–view–viewmodel Wikipedia: Model–View–ViewModel]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>