Najlepsze podejście do tworzenia nowego okna w WPF przy użyciu MVVM

W sąsiednim wpisie:Jak ViewModel powinien zamknąć formularz? Opublikowałem moją wizję zamknięcia okien za pomocą MVVM. A teraz mam pytanie: jak je otworzyć.

Mam główne okno (główny widok). Jeśli użytkownik kliknie przycisk „Pokaż”, pojawi się okno „Demo” (okno modalne). Jaki jest lepszy sposób tworzenia i otwierania okien za pomocą wzorca MVVM? Widzę dwa ogólne podejścia:

Pierwszy (prawdopodobnie najprostszy). Obsługa zdarzeń „ShowButton_Click” powinna być zaimplementowana w kodzie za głównym oknem w taki sposób:

        private void ModifyButton_Click(object sender, RoutedEventArgs e)
        {
            ShowWindow wnd = new ShowWindow(anyKindOfData);
            bool? res = wnd.ShowDialog();
            if (res != null && res.Value)
            {
                //  ... store changes if neecssary
            }
        }
Jeśli stan przycisku „Pokaż” powinien zostać zmieniony (włączony / wyłączony), musimy dodać logikę, która będzie zarządzać stanem przycisku;Kod źródłowy jest bardzo podobny do źródeł WinForm i MFC w starym stylu - nie jestem pewien, czy jest to dobre czy złe, proszę doradzić.Coś innego, co przegapiłem?

Inne podejście:

W MainWindowViewModel zaimplementujemy właściwość „ShowCommand”, która zwróci interfejs komendy ICommand. Comman z kolei:

podniesie „ShowDialogEvent”;zarządza stanem przycisku.

Takie podejście będzie bardziej odpowiednie dla MVVM, ale będzie wymagało dodatkowego kodowania: klasa ViewModel nie może „pokazać okna dialogowego”, więc MainWindowViewModel podniesie tylko „ShowDialogEvent”, MainWindowView, który będziemy musieli dodać do obsługi zdarzeń w swojej metodzie MainWindow_Loaded, coś takiego :

((MainWindowViewModel)DataContext).ShowDialogEvent += ShowDialog;

(ShowDialog - podobny do metody „ModifyButton_Click”).

Oto moje pytania: 1. Czy widzisz inne podejście? 2. Czy uważasz, że jeden z wymienionych jest dobry lub zły? (czemu?)

Wszelkie inne myśli są mile widziane.

Dzięki.

questionAnswers(6)

yourAnswerToTheQuestion