MVVM Light - Mehrere ViewModels (und verbinden sie)

8

Ich versuche, das MVVM-Muster (C #) zu lernen, das aus einem Windows Forms-Hintergrund stammt. 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.

Ich möchte (zum Beispiel) einen Button auf meinem MainViewModel haben, der über einen RelayCommand ein neues Fenster öffnet - sagen wir mal 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 / zu zeigen.

Ich habe einen Empfänger-Messenger in den Code-Behind-Konstruktor von "AboutView.xaml" gestellt - aber ich kann nicht erreichen, dass er irgendwelche Nachrichten vom AboutViewModel empfängt, und kann daher nicht "Show ()" machen / p>

Wenn jemand ein Beispiel für eine Mvvm Light WPF App hat, die mehrere Ansichten verwendet, wäre das großartig:)

    
Chris H 21.08.2012, 20:11
quelle

2 Antworten

3

Es gibt zwei Möglichkeiten, wie ich das leicht machen kann

Das erste wäre, ein Popup anstelle eines neuen Window zu verwenden. Zum Beispiel habe ich oft Eigenschaften in meine ViewModel für PopupContent und IsPopupVisible gesetzt und setze diese Werte immer dann, wenn ich mein Popup Steuerelement anzeigen möchte. Zum Beispiel könnte ein ShowAboutPopup relay-Befehl etwa so aussehen:

%Vor%

Sie können es mit einem Popup -Objekt oder einem benutzerdefinierten UserControl anzeigen. Ich bevorzuge es, mein eigenes benutzerdefiniertes Popup-Benutzersteuerelement zu verwenden, das normalerweise endet sah so aus:

%Vor%

Die Eigenschaft PopupContent ist ein ViewModel (z. B. AboutViewModel ), und DataTemplates werden verwendet, um WPF anzuweisen, spezifische ViewModels mit spezifischen Views

zu zeichnen %Vor%

Die andere Methode besteht darin, eine Art von ApplicationViewModel zu haben, die beim Start ausgeführt wird und für den gesamten Anwendungsstatus verantwortlich ist. Dazu gehört, welche Fenster geöffnet sind.

Normalerweise bevorzuge ich ein einzelnes ApplicationView , das ein ContentControl enthält, um die aktuelle Seite anzuzeigen

%Vor%

Es kann jedoch auch verwendet werden, um mehrere Fenster zu verwalten. 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 ein ViewModel tun 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 ein Beispiel mit diesem Navigationsstil in meinem Blog , wenn Sie es sind interessiert

    
Rachel 22.08.2012 13:09
quelle
0

Wie ich sehen kann, möchten Sie eine Navigation in Ihrer MVVM App?

Wort geht an den Ersteller von MVVM Light - Laurent Bugnion - mit seiner posten Sie über die Verwendung von Navigationsdienst zum Wechseln von Views . Es geht eigentlich um Windows Phone & amp; Silverlight Dies gilt jedoch auch für WPF .

Auch diese Antwort in verwandten Fragen verwendet diesen Ansatz.

    
Oleg 21.08.2012 21:06
quelle

Tags und Links