Właśnie dostaję się do MVVM w WPF.Czy MVVM ViewModel wykonuje konwersję/sprawdzanie typu?
Wdrożyliśmy nasze ViewModels z "mocno wpisanymi" właściwościami (int, double? Itd.), Które wiążemy w widoku.
Konwersja typów działa prawidłowo, w większości przypadków więc wprowadzanie danych jest dość proste. Ale mamy problemy z zatwierdzaniem.
Jeśli, powiedzmy, wartość nielicznikowa zostanie wprowadzona w polu tekstowym powiązanym z właściwością liczbową, konwersja nie powiedzie się, właściwość nigdy nie zostanie ustawiona i nigdy nie dostaniemy szansy na przekazanie użytkownikowi właściwej informacji zwrotnej. Co gorsza, właściwość zachowuje aktualną wartość, co prowadzi do niezgodności między tym, co jest wyświetlane w widoku, a tym, co faktycznie jest w ViewModelu.
Wszystko to może być obsługiwane za pomocą konwerterów wartości, wiem. Ale widziałem kilka opinii mówiących, że nawrócenie nie powinno być w ogóle odpowiedzialnością za pogląd. To, co jest wpisane w widoku, to łańcuchy znaków, a konwersja, walidacja itp. Powinny być odpowiedzialnością ViewModel (więc argument idzie).
Jeśli tak, powinniśmy przepisać większość właściwości w naszych modelach ViewModels na napisy i dostarczyć informacji o błędach za pomocą interfejsu IErrorInfo, na przykład. Z pewnością przyczyniłoby się to do uproszczenia i uproszczenia widoku XAML. Z drugiej strony konwersja, walidacja itp. Będą mniej deklaratywne, jednoznaczne i elastyczne, z punktu widzenia projektanta View.
Wydaje nam się, że te dwa podejścia są zasadniczo różne, więc zanim zdecydujemy, chcielibyśmy uzyskać pewne uzasadnione opinie SO w tej sprawie.
Tak: czy ViewModels powinien udostępniać w widoku uproszczony interfejs oparty na tekście i obsługiwać konwersję wewnętrznie? A może właściwości ViewModel powinny ujawniać rzeczywiste typy danych, pozostawiając takie zadania w widoku do obsługi?
Aktualizacja:
ciężko wybrać zwycięzcę tutaj, ale ostatecznie wylądował na jednym z was, która zawiera mniej lub bardziej jak ja.
W szczególności zdecydowaliśmy się zachować właściwości ViewModel wpisane. Główną tego przyczyną jest elastyczność, jaką daje nam w projektowaniu widoku oraz moc jawnej, deklaratywnej konwersji/formatowania w XAML.
Zauważyłem z tobą założenie, które nie zgadza się z nami w tej kwestii, że projekt widoku jest stały i gotowy. W związku z tym nie trzeba podejmować żadnych decyzji dotyczących konwersji, formatowania itp. Ale nasz jest zwinnym procesem, a nie mamy jeszcze wszystkich ważnych szczegółów interfejsu użytkownika.
W rzeczywistości pozostawienie szczegółów interfejsu użytkownika do opracowania po drodze pozostawia miejsce na kreatywność, a poza tym, moim zdaniem, nawet skrupulatnie opracowany projekt zawsze będzie się zmieniał w trakcie procesu wdrażania.
Wszystko wskazuje na to, że podczas egzekwowania reguł biznesowych na pewno należy do ViewModel, wydaje się nam, że prosta konwersja i formatowanie jest rzeczą poglądową. Może to brzmieć jak herezja, ale tak naprawdę nie uważam, że konwersja typu w widoku wymaga w ogóle testów jednostkowych (tak długo testujemy konwertery typów rzeczywistych).
W sumie wspaniała dyskusja, ludzie, z dobrze sformułowanymi, świadomymi opiniami. Dzięki.
Właśnie napisałem to pytanie. +1 – Gishu