MVVM - Unterschied zwischen Model und ViewModel

8

Ich habe MVVM noch nie zuvor benutzt, also vermisse ich wahrscheinlich etwas Offensichtliches. Wenn ich eine neue Panorama-Anwendung erstelle, gibt es bereits einen ViewModel-Ordner mit ItemViewModel und MainViewModel.

Ich dachte "MainViewModel.cs" ist die Datei, die das Panorama organisiert. In MainViewModel hat es jedoch folgende Zeile:

%Vor%

Das ItemViewModel hat keine Interaktion mit dem Panorama. Diese sind dann so instanziiert:

%Vor%

Warum ist ItemViewModel nicht einfach ein 'Model'? Es implementiert INotifyPropertyChanged, aber zu welchem ​​Zweck? Ich hätte gedacht, dass die ObservableCollection in MainViewModel ausreichen würde, um alle Änderungen zu melden, wie hier demonstriert

Danke

    
Brap 29.09.2010, 14:13
quelle

3 Antworten

5

Der ObservableCollection benachrichtigt Sie, wenn Elemente hinzugefügt oder aus der Liste gelöscht werden. Das INotifyPropertyChanged im ItemViewModel wird jedoch benötigt, wenn beim Ändern dieser Eigenschaften Benachrichtigungen auftreten sollen.

    
Robaticus 29.09.2010, 14:15
quelle
12

Der Unterschied ist ziemlich einfach.

Modell enthält Geschäftslogik.
Das Ansichtsmodell enthält eine Darstellungslogik und ist zusätzlich so gestaltet, dass es Ansichten entspricht.

In Ihrem Fall - Modell anzeigen implementiert INotifyPropertyChanged . Das ist reine Präsentationslogik.

Model ist nicht dafür verantwortlich, eine bestimmte Benutzeroberfläche zu benachrichtigen, dass sich etwas geändert hat, es ist verantwortlich für die Übertragung von Rechnungen, die Berechnung von Löhnen usw.

Manchmal (wenn das Modell einfach ist) ist diese Abstraktion jedoch nicht notwendig.

Einige Wiki Zitate:

Modell : Wie im klassischen MVC-Muster bezieht sich das Modell entweder auf
  (a) ein Objektmodell, das den Realzustandsinhalt darstellt (ein objektorientierter Ansatz) oder
  (b) die Datenzugriffsebene, die diesen Inhalt darstellt (ein datenzentrierter Ansatz).

ViewModel : Das ViewModel ist ein "Modell der Ansicht", dh es ist eine Abstraktion der Ansicht , die auch bei der Datenbindung zwischen der Ansicht und dem Modell dient. Es könnte als ein spezieller Aspekt eines Controllers (im MVC-Muster) betrachtet werden, der als Datenbinder / Konverter fungiert, der Modellinformationen in Ansichtsinformationen ändert und Befehle von der Ansicht in das Modell übergibt. Das ViewModel macht öffentliche Eigenschaften, Befehle und Abstraktionen verfügbar. Das ViewModel wurde mit einem konzeptionellen Status der Daten verglichen mit dem tatsächlichen Status der Daten im Modell verglichen.

    
Arnis Lapsa 29.09.2010 14:25
quelle
10

Es ist das gleiche allgemeine Konzept hinter allen MV [x] Architekturen, wenn auch MVC, MVP oder MVVM:

  • Sie haben das Modell auf der einen Seite, das ist im Grunde eine Software-Abstraktion Ihrer Geschäftsdomäne. Es kennt nichts und kümmert sich nicht um irgendwelche UI-bezogenen Dinge (wie in Ihrem Fall "Benachrichtigung der Benutzeroberfläche über Änderungen"). Es implementiert Geschäftslogik und das ist es.
  • Auf der anderen Seite haben Sie die UI mit spezifischen Anforderungen sowohl in technischer Hinsicht (zB 'WPF möchte an ein ObservableCollection binden') als auch in Bezug auf die Benutzerpräsentation (denken Sie zB über unterschiedliche Datumsreihenfolgen oder unterschiedliche Dezimalstellen) Zeichen in verschiedenen Sprachen).
  • Um dies zu bewältigen und diese Anforderungen in einer sauberen Architektur klar trennen zu können, benötigen Sie das [x], in Ihrem Fall das ViewModel. Es ist die einzige Ebene innerhalb der Software, die sowohl die Benutzeroberfläche als auch das Modell kennt. Andernfalls sollte zwischen den beiden keinerlei Verbindung bestehen.

In Ihrem einfachen Beispiel sieht das vielleicht nach einem Overkill aus, aber eine normale Business-Software wird Dutzende oder sogar Hunderte solcher MV [x] -Triplets enthalten, und Sie hätten keine Möglichkeit, eine saubere Architektur ohne diese aufrechtzuerhalten.

>

Um Ihre Frage zu beantworten: Was Sie in Ihrem Beispiel haben, ist nur ein bisschen Verdrahtungscode, um die beschriebene Architektur einzurichten.

HTH! Thomas

    
Thomas Weller 29.09.2010 14:36
quelle