2009-08-12 7 views
1

ich ziemlich neu bin MVVM und ich habe mehrere Fragen:mvvm Fragen: Definition des Modells, Packmodellobjekte und modaler Dialog

ist model = Business-Schicht?

Wenn ich ein Kundenmodell habe, das eine Liste von Bestellungen und eine Liste oder Bestellungen enthält, die jeweils eine Liste von Artikeln enthalten, wie würden Sie das in einer Ansicht trennen? Mein CustomerModel hat momentan ein CustomerViewModel. CustomerViewModel enthält eine Liste von OrderViewModel. OrderViewModel enthält eine Liste von ItemsViewModel. Wenn ich beispielsweise einen vorhandenen Kunden aus der Datenebene abrufe, würde ich dann basierend auf der vorhandenen Liste das entsprechende OrderViewModel und ItemViewModel erstellen. Wird mvvm normalerweise so implementiert? Ehrlich gesagt, fühlt sich das ganze "Umverpackungsobjekt" nicht richtig an.

Meine Kundenansicht enthält eine Liste von Bestellungen und Artikeln, die jeweils durch eine eigene Benutzerkontrolle repräsentiert und mit ItemsControl wiederholt werden. Jedes Element verfügt über eine eigene Schaltfläche zum Hinzufügen, Bearbeiten und Löschen. Ich möchte eine Art modalen Dialog haben, der den aktuellen Tab (nicht die gesamte App) deaktiviert, während der Benutzer ein entsprechendes Formular anzeigt. Die einfachste Lösung, die ich gefunden habe, bestand darin, ein Inhaltssteuerelement zu erstellen, das über ein Steuerelement dp (namens Control) verfügt, das Sie festlegen und das Rechteck-Overlay automatisch erstellen können, wenn isVisible = true ist. Steuerung dann gebunden an CustomerViewModel dialogControl Eigenschaft .... Ich sehe dies nicht als eine ordnungsgemäße MVVM-Lösung, da ich das ViewModel mit Sicht zu verwirren scheint. Ich denke, der angemessenere Weg wäre, ein Viewmodel im customerviewmodel zu haben, das darstellt, was der Dialog enthält, und eine Vorlage dafür in jedem viewmodel zur Verfügung zu stellen .... aber ich scheine nicht im Stande zu sein, eine Weise zu denken, das Rechtecküberlagerung mit zu implementieren diese Lösung.

Danke!

Antwort

0

Ich habe mit dieser Idee auch gestritten. Es scheint, als müssten Sie sich zwischen dem Model und dem ViewModel wiederholen. Der Hauptgrund dafür ist, dass das Modell tendenziell ein traditionelles Objekt ist und ein ViewModel INotifyPropertyChanged implementiert. Für mich ist das der Unterschied - ein ViewModel unterstützt bidirektionale Bindung.

Wenn ich einmal darüber nachdachte, wird das Modell optional. In meinem Fall ist das Modell normalerweise ein Bibliothekscode, den ich einbringe, oder eine generierte Datenzugriffsschicht. Anders gesagt, das ViewModel enthält die Funktionalität und das Model ist der Backing Store.

Ich habe sogar aufgehört, meine ViewModel-Klassen xxxViewModel oder xxxVM aufzurufen. Jetzt sind sie nur xxx. Sie implementieren jedoch alle von IViewModel, das selbst nur von INotifyPropertyChanged erbt.

Soweit Ihre Verwendung von Benutzersteuerelementen geht, konnte ich mit der Verwendung von nur DataTemplates für meine Ansichten durchkommen. Im Falle Ihrer Registerkarten sollte das ViewModel der Registerkarte den modalen Dialog starten und gleichzeitig die Eigenschaft Enabled auf "false" setzen, während das Dialogfeld geöffnet ist. Ihr Tab View sollte sich selbst deaktivieren, wenn die Enabled-Eigenschaft false ist.

+0

Ich stimme Ihrer Definition und den Unterschieden zwischen ViewModel und Model zu, aber was tun Sie für Eigenschaften, die auf der Model-Ebene verwaltet werden, die durch die Bindung verfügbar gemacht werden müssen? Kann die Model-Schicht INotifyPropertyChanged implementieren und wenn nicht, wie würden Sie eine Eigenschaft auf dem Modell erhalten, um Änderungen an der View zu blasen? – ScottCher

+0

@ScottCher: Es ist wirklich ein architektonisches Problem. Es gibt einfach keine Möglichkeit, alle Änderungen an einem Plain-Old-Objekt bis zum ViewModel, das es umschließt, automatisch zu blasen, es sei denn, Sie definieren Ereignisse, um dies zu tun. In meinem Fall verwende ich unveränderliche Modellobjekte, also habe ich dieses Problem nicht. ;) –

Verwandte Themen