2010-11-19 20 views
2

Die WPF/MVVM Alpha Geeks sagen:MVVM: Entwerfen Sie ein Ansichtsmodell Architektur mit aggregierten/je Viewmodels

1 View hat 1 Ansichtsmodell. Manchmal haben mehrere Ansichten 1 ViewModel (mit einem Wizard).

Wenn Sie mein Bild betrachten, sehen Sie 6 farbige Ansichten/UserControls. Die gelben, grünen und ORANGE UserControls werden in meiner Anwendung mehrfach verwendet

Die pinkfarbenen, blauen und roten UserControls werden nur einmal verwendet.

Fragen:

1. Soll ich sie machen auch Benutzersteuerelemente? Wenn ja, warum, wenn ich sie nicht wiederverwende.

2. Angenommen, das sind 6 UserControls, sollten sie dasselbe ViewModel verwenden? ODER sollte jedes View sein eigenes ViewModel haben?

A.) Classcode erstellen in GREEN senden Klassencode zu YELLOW

B.) Select Klassencode in YELLOW ändern aktuellen Schüler in BLUE

C) in BLUE aktuellen Schüler wählen ändern Schüler Details in RED ändern Schüler Dokumente in ORANGE

D.) in PINK erstellen Schüler Senden Schüler BLUE

E.) ... viele weitere

Ist das der Weg zu gehen, mit einer Messenger-Klasse um Daten Brennen die Beziehungen zu dem Laufenden halten?

Es ist ein großer Fehler für mich:

ich eine PupilViewModel erstellen, aber ich weiß nicht, in der NewPupilViewModel (PINK), ob ein SchoolclassCodeViewModel im YELLOW Usercontrol existiert, so konnte ich meine neue PupilViewModel zum BLUE Usercontrol hinzufügen .

SchoolclassCodeViewModel 1: N PupilViewModel.

3. Wie würden Sie dieses Problem lösen?

alt text

Antwort

3

Dan Ansatz ist ziemlich identisch zu dem, was ich vorschlagen würde. Um die spezifischen Fragen zu beantworten:

1) Ich würde sie UserControls machen, wenn ihre Layout überhaupt komplex ist. Zum einen ist es einfacher, alles konsequent zu machen. Zum anderen ist es einfacher, mit dem Layout dieses Steuerelements in Expression Blend zu experimentieren, ohne ein ganzes Fenster instanziieren zu müssen.

2) Es gibt ein Anwendungsansichtsmodell für das gesamte Fenster. Es enthält Eigenschaften für die Ansichten, die sie benötigen:

ObservableCollection<ClassCodeViewModel> ClassCodes 
ClassCodeViewModel NewClassCode 
ClassCodeViewModel SelectedClassCode 
PupilViewModel NewPupil 
PupilViewModel SelectedPupil 

2A) ClassCodeViewModel stellt eine CreateCommand, die ein Ereignis auslöst, wenn es ausgeführt wird. Das Fenstermodell verarbeitet dieses Ereignis und führt die entsprechende Aktualisierung auf ClassCodes durch, wenn es ausgelöst wird.

2B) Das Klassencodeansichtsmodell enthält eine beobachtbare Sammlung von Pupillensichtmodellen. Die SelectedItem-Eigenschaft in der SelectedClassCode-Eigenschaft im Fenstermodell, das an das Modell der Klassencodesichtlinie SelectedItem gebunden ist. Die blaue Ansicht ist an SelectedClassCode.Pupils gebunden.

2C) In ähnlicher Weise enthält das Fensteransichtsmodell eine SelectedPupil-Eigenschaft, an die die SelectedItem-Eigenschaft der blauen Ansicht gebunden ist. Die rote Ansicht ist an SelectedPupil gebunden.

2D) Dies wird auf dieselbe Weise gehandhabt wie in 2A: Das Pupillensichtmodell löst ein Ereignis aus und das Fenstermodell verarbeitet es.

3) Das Pupillensichtmodell enthält eine boolesche CanCreate-Eigenschaft. Dies wird nicht in der roten Ansicht verwendet. Das Fensteransichtsmodell setzt NewPupil.CanCreate im Setter von SelectedClassCode.

Sie haben nicht gefragt, aber die orange Ansicht ist an die Documents Eigenschaft von SelectedPupil gebunden, die wahrscheinlich (abhängig davon, welche Dokumente tatsächlich sind) eine beobachtbare Sammlung von DocumentViewModel Objekten.

Vielleicht habe ich zu lange in den Bereichen von MVVM gearbeitet, aber das scheint mir sehr einfach zu sein.

+0

Lieber Robert, ich habe Recht, Sie gehen davon aus, dass ich ONE ViewModel für alle Ansichten verwende? Wenn ja, dann ist die Lösung einfach, weil ich das auch vorher probiert habe, ABER es gibt einen Nachteil => Für die wiederverwendbaren Ansichten kann ich den ViewModel_Code nicht wiederverwenden, ich müsste kopieren + einfügen, damit mein Code DOUBLE oder sogar TRIPLE verwendet das DocumentsView UserControl an 3 verschiedenen Orten. – Elisabeth

+0

Ein weiterer großer Nachteil für mich, ein ViewModel und eine View mit den 6 Views zu haben, ist die View + VM wird über einen Viewmodel Locator aufgerufen und das View + ViewModel wird über MEFedMVVM erstellt. Das ist in Ordnung, aber die 6 Views innerhalb der One View - die in das ContentControl gelegt wird - können nicht von MEFedMVVM erstellt werden, da es jetzt NO 6 ViewMOdels mehr gibt ... also werde ich den gesamten visuellen Status in den 6 Views verlieren. – Elisabeth

+0

Über y 2. Nachteil Ich glaube, ich lag falsch, weil das eine ViewModel im ContentControl - mit der einen Ansicht mit den 6 Ansichten - nur einmal erstellt und geteilt wird, so dass der Datenkontext, an den alle 6 Views gebunden sind, auch über Two-Way gespeichert wird Datenbindung. OK, also scheint mir nur der ERSTE Nachteil zu gelten. – Elisabeth