Wie Sie ein FolderBrowserDialog aus einer WPF-Anwendung mit MVVM
Ich versuche, die FolderBrowserDialog
aus meiner WPF-Anwendung - nichts besonderes. Ich weiß nicht viel Pflege, dass es die Windows Forms aussieht.
Fand ich eine Frage mit einer passenden Antwort (Wie Sie ein FolderBrowserDialog aus einer WPF-Anwendung), außer ich bin mit MVVM.
Diesem war die Antwort, die ich "umgesetzt", außer das ich nicht an das window-Objekt, und ich bin nur zum telefonieren ShowDialog()
ohne Parameter.
Das problem ist Folgendes:
var dlg = new FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dlg.ShowDialog(this.GetIWin32Window());
In meinem ViewModel
es die this
hat keine GetIWin32Window()
Methode für mich, um das Fenster Kontext.
Irgendwelche Ideen auf, wie diese Arbeit zu machen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie könnte verwenden Sie die ShowDialog-Signatur, die nicht erfordert ein Fenster.
Zweite, Sie könnte senden Sie das Hauptfenster der Anwendung, wie die besitzende Fenster.
Die zweite option möglicherweise nicht als sehr MVVMish.
Siehe die Antwort von @Dr. ABT in diese Frage für ein Weg, um zu injizieren, die einen Zeiger auf die Ansicht in der ViewModel (nicht sicher, ob das eine gute Idee oder eine schlechte Idee ist, aber ich werde nicht zu lassen, die mich aufhalten) Mit dieser Technik, Sie hätte Zugriff in der VM zu der entsprechenden Anzeigen, wenn Sie wirklich wollen, um die Ansicht der Eigentümer des FolderBrowserDialog.
@ChrisDD ist direkt über die Definition einer Schnittstelle und der Verpackung FolderBrowserDialog. Das ist, wie wir es tun:
Dann machen wir die VM/Befehl wo wollen wir mit der FolderBrowser-import IFolderBrowserDialog. In der Anwendung, IFolderBrowserDialog.ShowDialog zeigt das Dialogfeld. Im unit-test, wir verspotten IFolderBrowserDialog, damit wir überprüfen können, dass es hieß, mit den korrekten Parametern und/oder senden Sie die ausgewählten Ordner zurück an das sut, so dass der test fortgesetzt werden kann.
Wenn Sie entschlossen sind, zu verwenden, FolderBrowserDialog, würde ich diese Art von design.
Erstellen Sie zunächst eine DependencyProperty auf Ihre Anzeigen aussetzen der Griff.
Jetzt, wenn die Fenster geladen wird, können Sie abrufen, den Griff mit der Erweiterung in der Frage, die Sie im Zusammenhang mit:
So, Sie sind verbindlich one-way-Quelle mit einem "WindowHandle" - Eigenschaft. Also, wenn Ihr ViewModel hat ein WindowHandle-Eigenschaft, es wird immer aktuell gehalten mit den gültigen IWin32Handle für die zugehörigen anzeigen:
Dies ist eine gute Lösung, weil du bist nicht hart codieren eine ViewModel-gekoppelt werden mit einer besonderen Ansicht. Wenn Ihr mit mehreren Ansichten mit dem gleichen ViewModel, es sollte nur funktionieren. Wenn Sie eine neue Ansicht erstellen, aber Sie nicht umzusetzen, die DependencyProperty, es wird nur im Betrieb mit einem null-handle.
EDIT:
Als eine Randnotiz, hast du eigentlich getestet, nur nicht die eine IWin32Owner parameter? Für mich ist es immer noch automatisch öffnet, da ein modales Dialogfeld für die Anwendung und verhindert, dass der user von der Interaktion mit allen von der Anwendung windows. Ist es etwas, das Sie brauchen, es zu tun statt?
MVVM + WinForms FolderBrowserDialog wie Verhalten
Nutzung
Beitrag: http://kostylizm.blogspot.ru/2014/03/wpf-mvvm-and-winforms-folder-dialog-how.html
MVVM Weg:
Definition einer neuen Schnittstelle für FolderBrowserDialog. Erstellen Sie eine neue Klasse & implementieren diese Schnittstelle. (Die Umsetzung erfolgt mit aktuellen FolderBrowserDialog-Klasse).
Diese Weise werden Sie nicht binden MVVM um die konkrete Umsetzung und die eigentliche Logik kann man später getestet.
Um mit jeder Art von dialog Sachen in das mvvm-Muster, sollten Sie gehen mit einer Art Dialog-Service. In dieser Beitrag finden Sie einige Hinweise zu diesem Ansatz.
Setzen dialog in Sachen service hält das mvvm-Muster unberührt. Der service kümmert sich um alle die Schaffung der Dialoge und liefern die Ergebnisse. Das view-Modell ruft nur Methoden und abonniert Veranstaltungen von a-service.
wenn Sie mithilfe von dependency injection für den service (- Schnittstelle), erhalten Sie den Vorteil halten Sie die Lösung getestet werden, indem Sie spöttisch. Oder Sie ersetzen könnten die Formen folderbrowserdialog, wenn es in wpf ein.
Ist es praktisch, über Verhalten in diesem Fall. Hinzufügen einer dependency property und die Sie verwenden können, binden Sie den Wert aus dem Dialogfeld, um eine Eigenschaft in das viewmodel.
In der Ansicht;