5 Stimmen

Silverlight MVVM Verknüpfung von Modell und Ansichtsmodell

Es gibt viele tolle Beispiele für MVVM, aber ich bin immer noch verwirrt.

Sagen wir, Sie haben ein CustomerModel und ein CustomerViewModel. Es scheint, dass es eine Name-Eigenschaft auf dem CustomerModel und eine auf dem CustomerViewModel geben würde. Der Setter auf dem CustomerViewModel setzt die Eigenschaft Name des CustomerModel und ruft dann OnPropertyChanged(PropName) auf, damit die Benutzeroberfläche aktualisiert wird. Ist das wirklich richtig? Es scheint, dass die Getter/Setter zweimal definiert werden. Wenn Sie ein Modell mit 50 Eigenschaften haben, dann wird das sehr mühsam werden.

Außerdem kann ich eine Eigenschaft Qty festlegen. Das ViewModel aktualisiert das Model. Das Modell aktualisiert seine Value-Eigenschaft auf der Grundlage der neuen Qty. Wie wird das ViewModel benachrichtigt, dass die Model-Eigenschaft geändert wurde?

5voto

wekempf Punkte 2711

Ihr ViewModel muss das Model nicht so streng kapseln. In Ihrem Szenario könnte das CustomerViewModel eine Customer-Eigenschaft haben, was letztendlich bedeutet, dass Ihre Ansicht an die Model-Eigenschaften gebunden ist... sie tut dies nur über das ViewModel. Das ist völlig legitim. Dennoch ist es oft von Vorteil, dies zu kapseln. Ihr Geschäftsmodell sieht möglicherweise keine Änderungsbenachrichtigung vor. Sie möchten vielleicht nicht, dass die Benutzerinteraktion das Geschäftsmodell ändert, bis der Benutzer auf eine OK-Schaltfläche klickt. Ihr Geschäftsmodell kann Ausnahmen für fehlerhafte Eingaben vorsehen, während Sie eine andere Form der Validierung verwenden möchten. Sicherlich fallen Ihnen noch andere Dinge ein. In der Tat würde ich vermuten, dass Sie die meiste Zeit die Kapselung wollen, so dass es nicht wirklich "mühsam" in dem Sinne ist, dass Sie nur eine Lo

2voto

Anthony Punkte 5038

In dem von Ihnen genannten Kundenbeispiel enthält das CustomerModel alle Informationen, die in Ihrer Datenbank (oder einem anderen Backend) gespeichert sind. Das CustomerViewModel enthält ähnliche Informationen, wenn es auf der Benutzeroberfläche angezeigt werden soll (Name usw., potenziell 50 weitere Eigenschaften, wenn Sie eine große Klasse haben), verwendet jedoch die Schnittstelle INotifyPropertyChanged, um sie als Eigenschaften anzuzeigen, an die die Ansicht (d. h. die XAML) binden kann.

z.B..

public int Name
{
    get
    {
        return this.name;
    }

    set
    {
        if (this.name!= value)
        {
            this.name= value;
            this.OnPropertyChanged("Name");
        }
    }
}

Das ViewModel enthält auch andere Teile des UI-Status - Sichtbarkeitsflags, den aktuellen Tab-Index, komplexere Textteile, die aus Daten in mehreren Feldern bestehen, ObservableCollection<> von Kindelementen usw. Alle sind dazu da, an die XAML gebunden zu werden.

Ich habe gesehen, dass das ViewModel aus dem Model als einmaliger, einseitiger Prozess erstellt wird, z.B. mit einem Konstruktor:

  CustomerViewModel viewModel = new CustomerViewModel(customer);

oder als Erweiterungsmethode

  CustomerViewModel viewModel = customer.ToViewModel();

Ich habe keine Bestimmung für die Aktualisierung eines ViewModel für Änderungen an das Modell gesehen - der Punkt der ViewModel ist, dass es vom Modell isoliert ist. Es behält eine separate Kopie der Daten. Es überträgt die Änderungen nicht an das Modell zurück, nicht bevor Sie eine Schaltfläche "Speichern" drücken. Wenn Sie also stattdessen abbrechen, hat sich im Modell nichts geändert und es gibt nichts rückgängig zu machen.

Möglicherweise versuchen Sie zu sehr, das ViewModel mit dem Model auf dem neuesten Stand zu halten - in den meisten Fällen, wie z.B. beim Speichern oder Laden, können Sie das aktuelle ViewModel einfach wegwerfen und ein neues aus dem aktuellen Zustand des Models erstellen. Müssen Sie den UI-Status des ViewModels beibehalten und die Daten darin ändern? Das ist keine übliche Anforderung, aber es könnte mit einer oder zwei Methoden geschehen, die aufgerufen werden, wenn das Speichern oder Laden geschieht.

Es ist also davon auszugehen, dass diese Verkabelungslogik irgendwo stattfindet. Das ist der Grund, warum die meisten Muster, die Ansichten beinhalten auch Kontrolleure die für das Ausführen von Befehlen (z. B. einen Kunden anzeigen, einen Kunden speichern) und das anschließende Einrichten eines neuen UI-Zustands verantwortlich sind.

0voto

Steve Brouillard Punkte 3270

Wie dies genau geschieht, hängt zum Teil von Ihrem Geschäftsmodell ab, da wekempf hat bereits erklärt.

Je nachdem, wie Sie Kundeninformationen in Ihrer Benutzeroberfläche anzeigen, haben Sie möglicherweise eine ObservableCollection von Customer(your model)-Typen in Ihrem ViewModel. Wenn Sie z. B. ein Master/Detail-Szenario anzeigen, in dem Sie eine Liste von Kunden haben und unten Details anzeigen, wenn ein bestimmter Kunde ausgewählt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X