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:)
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:
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:
Die Eigenschaft PopupContent
ist ein ViewModel
(z. B. AboutViewModel
), und DataTemplates
werden verwendet, um WPF anzuweisen, spezifische ViewModels
mit spezifischen Views
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
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
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.