2016-04-07 12 views
3

Ich erstelle eine MVVM WPF-Anwendung, in der ein Assistent mit mehreren untergeordneten Ansichten in einer übergeordneten Ansicht (V) geladen wird, die ViewModel (VM) als Datenkontext verwendet. Eines der MVVM-Musterprinzipien besagt, dass die VM keine Kenntnis über das V haben sollte, das an sie gebunden ist. In diesem Fall ist die VM dem V tatsächlich nicht bekannt, jedoch verwaltet die VM (1) eine Listeneigenschaft, die aus verschiedenen untergeordneten Ansichten besteht (dh verschiedene Schritte), und (2) hat eine andere Eigenschaft mit dem Namen CurrentView, der dynamisch zugewiesen werden soll Element in der Liste. CurrentView ist mit einem ContentControl in V. gebundenMVVM ViewModel und untergeordnete Ansichten

sind Meine Fragen:

  1. in Ordnung ist (Kind) Ansichten innerhalb der VM zu verwalten? Mit anderen Worten, die VM weiß nichts von dem übergeordneten V, weiß aber, welche untergeordneten Ansichten geladen werden sollen.
  2. Anstatt andere untergeordnete VM für verschiedene untergeordnete Ansichten zu verwenden, binde ich einfach eine übergeordnete VM an das übergeordnete V, und wenn ein untergeordnetes V geladen wird, kann es denselben Datenkontext mit dem übergeordneten übergeordneten V verwenden richtiger Weg?

Antwort

8

die übergeordnete Ansicht Modell sollte die Kenntnis der Modelle Kind Blick hat, das Kind nicht Ansichten. Ebenso sollte das View, nicht das View-Modell, für das Austauschen der untergeordneten Ansichten verantwortlich sein.

Hier ist, wie Sie zu diesem gehen könnte ...

Ihrer Ansicht nach einige Datenvorlagen erstellen, wie folgt aus:

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:WizardScreen1ViewModel}"> 
     <v:WizardScreen1 /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:WizardScreen2ViewModel}"> 
     <v:WizardScreen2 /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type vm:WizardScreen3ViewModel}"> 
     <v:WizardScreen3 /> 
    </DataTemplate> 
</Window.Resources> 

Dann wird in dem Teil Ihrer Ansicht, in der Sie die aktuelle Anzeige Assistenten-Bildschirm, ein ContentControl setzen, wie folgt aus:

<ContentControl Content="{Binding CurrentWizardScreenViewModel}" /> 

In Ihrem geordneten Ansicht Modell, benötigen Sie eine CurrentWizardScreenViewModel Eigenschaft, die einfeuert 0 Ereignis wenn es sich ändert.

Dann müssen die nächsten/vorherigen Schaltflächen Ihres Assistenten an die Befehle in Ihrem übergeordneten Ansichtsmodell gebunden werden, die bewirken, dass CurrentWizardScreenViewModel auf das Anzeigemodell des nächsten/vorherigen Bildschirms gesetzt wird.

Wenn Sie dies tun, sorgt die Ansicht automatisch dafür, dass die Anzeige des Assistenten dank der Magie der Datenbindung deaktiviert wird.

+0

Soll ich die untergeordneten VMs verwalten ihre eigenen Daten, die möglicherweise von ihnen gemeinsam genutzt werden (d. H. Schritt 3 benötigt möglicherweise etwas aus Schritt 1), oder einfach alles in der übergeordneten VM behandeln? – tab87vn

+1

@ tab87vn, Es gibt ein paar Möglichkeiten, mit denen Sie gehen: (1) das Parent-View-Modell verwalten/orchestrieren den freigegebenen Zustand durch Abhören von Änderungsbenachrichtigungen auf jedem der Kind-View-Modelle, dann informieren die anderen Kind-View-Modelle der new state oder (2) Sie könnten das Modell der Elternansicht aus dem Modell herauslassen und die Modelle der Kindsicht direkt mit einem Messenger kommunizieren lassen (was die meisten MVVM-Bibliotheken unterstützen). – devuxer

Verwandte Themen