Próbuję nauczyć się WPF i problemu MVVM, ale wpadłem w kłopoty. To pytanie jest podobne, ale nie takie samo jak to (obsługa-dialogów-w-wpf-z-mvvm) ...
Mam formularz „Login” napisany przy użyciu wzorca MVVM.
Ten formularz ma ViewModel, który przechowuje nazwę użytkownika i hasło, które są powiązane z widokiem w XAML przy użyciu normalnych powiązań danych. Posiada również polecenie „Login”, które jest powiązane z przyciskiem „Zaloguj się” w formularzu, a także przy użyciu normalnego wiązania danych.
Po uruchomieniu polecenia „Login” wywołuje funkcję w ViewModel, która wyłącza się i wysyła dane przez sieć, aby się zalogować. Po zakończeniu tej funkcji dostępne są 2 działania:
Login był nieprawidłowy - po prostu wyświetlamy MessageBox i wszystko jest w porządku
Login był prawidłowy, musimy zamknąć formularz logowania i zwrócić go, aby był prawdziwy, ponieważ
DialogResult
...
Problem polega na tym, że ViewModel nie wie nic o rzeczywistym widoku, więc w jaki sposób można go zamknąć i poprosić o zwrócenie określonego DialogResult? Mógłbym przykleić trochę kodu do CodeBehind i / lub przekazać View do ViewModel, ale wygląda na to, że całkowicie pokonałby cały punkt MVVM ...
Aktualizacja
W końcu właśnie naruszyłem „czystość” wzoru MVVM i kazałem Viewowi opublikować Closed
zdarzenie i ujawnić Close
metodę. ViewModel po prostu zadzwoniłby view.Close
. Widok jest znany tylko przez interfejs i podłączony do kontenera IOC, więc nie można utracić możliwości testowania ani konserwacji.
Wydaje się głupie, że przyjęta odpowiedź to -5 głosów! Chociaż jestem w pełni świadomy dobrych uczuć, które można uzyskać, rozwiązując problem, będąc „czystym”, z pewnością nie jestem jedynym, który uważa, że 200 linii zdarzeń, poleceń i zachowań, aby uniknąć metody jednowierszowej w nazwy „wzorów” i „czystości” są nieco śmieszne ...
Close
metoda jest nadal najlepszym rozwiązaniem. Cała reszta w innych, bardziej skomplikowanych oknach dialogowych to MVVM i baza danych, ale wydawało się głupotą wdrażanie tutaj wielkich „rozwiązań” zamiast prostej metody…