2012-08-21 6 views
8

Ich versuche, das MVVM-Muster (C#) zu lernen, aus einem Windows Forms-Hintergrund gekommen. Ich benutze das MVVM Light Toolkit und bisher finde ich es brilliant. Ich habe mehrere kleine Anwendungen gemacht, aber eine Sache, mit der ich Probleme habe, ist die Einführung einer zweiten Ansicht.MVVM Light - Mehrere ViewModels (und verbinden sie)

Ich möchte (zum Beispiel), haben eine Schaltfläche auf meinem MainViewModel, die über ein RelayCommand, öffnet ein neues Fenster - sagen wir ein "About" -Fenster. Ich habe stundenlang im Internet dafür geforscht, aber es scheint, dass ich mein AboutViewModel nicht dazu bringen kann, mit meinem AboutView zu kommunizieren.

Ich habe einen empfangenden Messenger in den Code-Behind-Konstruktor der AboutView.xaml platziert - aber ich kann es nicht bekommen, irgendwelche Nachrichten vom AboutViewModel zu erhalten, und kann es daher nicht "Show()" machen.

Wenn jemand ein Beispiel für eine mvvm Licht WPF-Anwendung mit mehreren Ansichten hat, die :)

+0

Einige Ihrer Code wäre super hilfreich, um eine Antwort zu finden ... – EtherDragon

Antwort

0

groß sein würde, ich sehe Sie eine Navigation in Ihrem MVVM App wollen?

Wort geht an den Schöpfer von MVVM Light-Laurent Bugnion - mit seinem post über die Verwendung von Navigation Service für Views wechseln. Es ist tatsächlich über Windows Phone & Silverlight aber sollte auch gelten für WPF.

Auch diese answer in verwandten Frage verwendet diesen Ansatz.

3

Es gibt zwei Möglichkeiten, wie ich denke, kann dies

Die erste leicht zu tun würde eine Popup statt eines neuen Window zu bedienen. Zum Beispiel setze ich oft Eigenschaften in meine ViewModel für PopupContent und IsPopupVisible, und setze diese Werte immer, wenn ich meine Popup Steuerung anzeigen möchte. Zum Beispiel kann ein ShowAboutPopup Relais Befehl könnte wie folgt auszuführen:

void ShowAboutPopup() 
{ 
    PopupContent = new AboutViewModel(); 
    IsPopupVisible = true; 
} 

Sie es anzeigen kann ein Popup Objekt verwenden oder eine benutzerdefinierte UserControl. Ich ziehe meine eigenen custom Popup UserControl, die in der Regel wie folgt aussehen wird am Ende zu verwenden:

<Window> 
    <Canvas x:Name="RootPanel"> 
     <SomePanel> 
      <!-- Regular content goes here --> 
     </SomePanel> 

     <local:PopupPanel Content="{Binding PopupContent}" 
      local:PopupPanel.IsPopupVisible="{Binding IsPopupVisible}" 
      local:PopupPanel.PopupParent="{Binding ElementName=RootPanel}" /> 
    </Canvas> 
</Window> 

Die PopupContent Eigenschaft ist ein ViewModel (wie ein AboutViewModel) und DataTemplates verwendet WPF zu sagen, bestimmte ViewModels mit spezifischen zu zeichnen Views

<Window.Resources> 
    <DataTemplate DataType="{x:Type local:AboutViewModel}"> 
     <local:AboutView /> 
    </DataTemplate> 
</Window.Resources> 

Das andere Verfahren ist eine Art von ApplicationViewModel, die beim Start ausgeführt haben, und ist für den gesamten Anwendungszustand verantwortlich, die das Fenster umfasst (en) ist geöffnet.

Normalerweise ziehe ich ein einziges ApplicationView zu haben, die ein ContentControl enthält die aktuelle Seite

<Window> 
    <ContentControl Content="{Binding CurrentViewModel}" /> 
</Window> 

jedoch auch mehrere Fenster verwalten verwendet werden kann, angezeigt werden soll. Wenn Sie es verwenden, um mehrere Window Objekte zu verwalten, sollten Sie darauf hingewiesen werden, dass dies kein reines ViewModel ist, da es auf einige View-spezifische Objekte zugreifen muss und UI-Objekte referenziert, was nicht eine Aufgabe von ViewModel sein sollte. Zum Beispiel kann es abonnieren, um ShowWindow Nachrichten zu empfangen, und beim Empfang dieser Nachrichten würde es die angegebene Ansicht erstellen und anzeigen und möglicherweise auch das aktuelle Fenster ausblenden.

Persönlich versuche ich, mehrere Fenster so viel wie möglich zu vermeiden. Meine übliche Methode ist eine einzige View, die konsistente Anwendungsobjekte für jede Seite enthält, und eine ContentControl, die dynamischen Inhalt enthält, der sich ändert. Ich habe eine example using this navigation style on my blog wenn Sie interessiert sind

+1

+1 für Anstrengung und "hubristic". –

Verwandte Themen