[MVVM+WPF] DialogService und Owner-Window


  • Administrator

    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 Property OwnerWindow .
    2. Der DialogService verwendet Application.Current.MainWindow .
    3. Der DialogService durchsucht Application.Current.Windows nach einem IsActive == true .
    4. Man muss an den DialogService ein OwnerViewModel übergeben, welches dann in den DataContext Properties der Application.Current.Windows gesucht wird.

    Lösung 1: Simple aber nicht automatisch.
    Lösung 2: Ist nicht immer das aktive Fenster und kann sogar null sein.
    Lösung 3: Durchsuchen der Fenster? Geht das nicht einfacher?
    Lösung 4: Ich habe einen DialogService, welcher nicht nur Window Objekte hat und somit nicht überall ein DataContext 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-iwindowservice

    Der 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).


Anmelden zum Antworten