[MVVM+WPF] DialogService und Owner-Window
-
Hallo zusammen,
Welche Lösungen verwendet ihr bei einem DialogService, damit das korrekte Owner-Window dem Dialog übergeben wird? Ich habe bisher vier Lösungen gesehen, aber sie gefallen mir irgendwie alle nicht so und wollte mal wissen, ob ihr noch andere kennt:
1. Der DialogService erhält eine ein PropertyOwnerWindow
.
2. Der DialogService verwendetApplication.Current.MainWindow
.
3. Der DialogService durchsuchtApplication.Current.Windows
nach einemIsActive == true
.
4. Man muss an den DialogService ein OwnerViewModel übergeben, welches dann in denDataContext
Properties derApplication.Current.Windows
gesucht wird.Lösung 1: Simple aber nicht automatisch.
Lösung 2: Ist nicht immer das aktive Fenster und kann sogarnull
sein.
Lösung 3: Durchsuchen der Fenster? Geht das nicht einfacher?
Lösung 4: Ich habe einen DialogService, welcher nicht nurWindow
Objekte hat und somit nicht überall einDataContext
vorhanden ist.Ich bin gespannt auf eure Vorschläge und Begründungen. Ich tendiere aktuell am ehesten noch zur Lösung 1, weil sie einfach einfach ist und man alle Türen offen hat. So kann man auch einfach das
MainWindow
dort setzen und fertig. Dialog über Dialog sollten dann auch gehen.Grüssli
-
Ich habs bei mir immer so das ich dem "WindowService" (Resolved aus nem ServiceLocator (auch ServiceProvider genannt) View-ViewModel Paare bekannt mache.
dadurch habe ich am Ende die Möglichkeit zu sagen:
public class FooViewModel : ObservableObject { private void ShowBar() { var windowService = ServiceLocator.Resolve<IWindowService>(); var barViewModel = new BarViewModel(); windowService.ShowDialog(this, barViewModel); } }
"this", also das ViewModel ist dann der Owner und barViewModel dann das neue Fenster.
Der WindowService erstellt alle fenster und kennt alle offenen, bei dem Owner holt er sich die View anhand des ViewModels aus den offenen Fenstern, das neue ViewModel ist dann der DataContext des neuen Fensters das er erstellt sobald er den View Typen anhand des ViewModels ermittelt hat.Siehe dazu auch:
http://www.my-libraries.de/index.php/component/content/article/11-libraries/dwservices/68-iwindowserviceDer Vorteil ist das man es dadurch auch sehr leicht testen kann, einfach ein IWindowService Mock unterschieben schon kannst du das Ergebnis aus den Tests beeinflussen.
Falls es mehrere Views zu ein ViewModel geben kann, dann registrier ich die Views mit nem Namen, dann sagt man beim ShowDialog auch noch welche View man gerne hätte.
Das ViewModel sollte keine View Objekte erstellen oder gar anzeigen, dadurch ist es nicht mehr Testbar. Ich gehe sogar soweit das ich sage das das "ViewModel Projekt" nichtmal das "View Projekt" kennen darf. also ein service.ShowDialog<BarView>(barViewModel) ist dadurch nicht möglich (erlaubt).