Mit MVVM zeigen, neue Fenster und erhalten Sie updates Daten
Ich arbeite gerade an einer WPF-MVVM-Anwendung. Zeige ich einige Daten in einem datagrid. Ich habe zwei buttons zum Hinzufügen und Bearbeiten Sie den ausgewählten Datensatz. Ich habe die Daten im ViewModel, und ich habe, um zu zeigen, ein anderes Fenster (view) und stellen Sie sicher, dass ViewModels sollten keine Informationen über sichten.
Wo sollte ich seine Ansicht und viewmodel?
Wie bekomme ich die Daten zurück und update datagrid?
Wie kann ich erreichen, das in MVVM?
Wir haben noch nicht beschlossen, keinen Rahmen, also habe ich, um meine eigene Schnittstelle.
- ist Ihre "andere Fenster", wie ein Modaler dialog? Das heißt, es ist ein separates Fenster, das hält den Fokus, bis es wieder geschlossen wird, und dann der Fokus wieder auf das Hauptfenster?
- Ja, das ist ein modales Dialogfeld.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinweis: Dies endete als eine ziemlich lange Antwort - Fragen Sie mich bitte, wenn etwas unklar ist
Die Umsetzung von dialog-Fenstern ist ein umstrittenes Thema in der MVVM-designs, und verschiedene Leute haben verschiedene Ansätze.
Wie Sie, habe ich beschlossen, nicht zu verwenden-framework und implementiert die meisten Dinge mit der hand. Wenn es darum geht dialog-Fenster, ich wähle pragmatisch über meine Implementierung des MVVM, durch die Einführung die Dialog-Fenster von innen mein ViewModel. Auch Erlaube ich, dass jedes Dialogfeld im ViewModel zu haben, einen Verweis auf das Fenster angezeigt, so dass Sie schließen können, wenn entsprechende (details siehe unten). Das bricht einige der strengen MVVM "Regeln", aber es bekommt den job getan.
Den Haupt-Nachteil dieser Lösung ist, dass es brechen könnte-unit-Tests, wenn Sie etwas testen, dass geht über einen dialog. Jedoch, Sie können gehen einen langen Weg ohne laufen in dieses problem und es hat mich nicht gestört, doch.
Hab ich gebaut bis ein bisschen eine Bibliothek von dialog ViewModels, die kann ich problemlos erweitern. Es ist viel zu viel code hier zu posten, aber ich werde zeigen Ihnen die highlights.
Base-ViewModel für Dialoge
Jede meiner Dialogfeld windows hat ein ViewModel, das erbt von
DialogViewModelBase
, die ist ähnlich wie meine regelmäßigenViewModelBase
in, dass es bietet Unterstützung fürINotifyPropertyChanged
etc. Der interessante Teil ist dieser öffentliche Methode, die ich nenne, von wo auch immer starten Sie den Dialog:Fenster gestartet, in der obigen Methode zu schließen, wenn seine
Window.DialogResult
- Eigenschaft gesetzt ist. Dies ist der Grund, warum dieDialogWindow
ist eine Eigenschaft derDialogViewModelBase
Klasse - wenn die Unterklassen dialogViewModel
will, um das Dialogfenster zu schließen, wird einfach das Ergebnis:Host-Fenster für Dialog-Ansichten
Den
Dialogs.Views.DialogWindow
Klasse, dass dieShowDialogWindow
Methode instanziiert wird in XAML definiert und ist eine Unterklasse vonWindow
. Es hat zwei wichtige Funktionen. Die erste ist, dass es das primäre element ist einfach einContentControl
bindet an den aktuellen Kontext. Dies ermöglicht es mir, anders definierenViews
für verschiedene Unterklassen vonDialogViewModelBase
, und dieDialogWindow
wird host die entsprechendenView
basierend auf dem Typ der Kontext:Die zweite wichtige Funktion des
DialogWindow
XAML ist, dass Sie definiert, welche dialogViews
gehen mit dem dialogViewModels
. Hier ist ein Beispiel:Was all dies bedeutet, ist, dass ich definieren kann, Dialoge, die als Unterklassen zu
DialogViewModelBase
und Umsetzung einerView
für jeden, und dann sagen SieDialogWindow
dieView
seineContentControl
müssen zeigen, für die dialogViewModel
.Starten einen Dialog und erste Ergebnisse
Unten ist ein Beispiel aus einem meiner Anwendung
ViewModels
, in denen ich starte ein Dialog-Fenster, das dem Benutzer ermöglicht, wählen Sie einen Asset-Typ für die Schöpfung:PS: ich sollte wirklich schreiben, einen blog-Eintrag über dieses - wenn ich es Tue, werde ich den link hier posten, da der blog-Eintrag wird wahrscheinlich mehr komplett code-Beispiele.
Es hängt davon ab, wie Sie die Handhabung der Daten. Ich gehe davon aus, dass die änderungen im popup-Fenster können nur akzeptiert werden, wenn der Benutzer klickt auf etwas, was wie sparen, im anderen Fall wird Sie verworfen werden sollte.
Also, Erstens, ich würde vorschlagen, mit MVC-Ansatz als controller ist perfekt für solche Aufgaben. Sie bauen viewmodels in es, ordnen Sie o Ansichten und zeigen die Ansichten. VM ' s einfach hält-Daten und-Befehle, Befehle die execute-Methoden gehalten werden, im controller. In anderen Worten, Sie haben eine singleton Klasse, die verwaltet Ihre VM ' s und Ansichten.
Sie sollten überprüfen, PRISMA Rahmen. Es bietet große Dinge wie anzeigen, regios, wo Sie injizieren verschiedene Bedienelemente auf der Laufzeit, der befiehlt und MVC-Schichtung aus der box neben IOC und DI-Muster.