2009-10-14 5 views
6

Cóż, myślę, że mam dość dobrą znajomość MVVM. Ale potrzebuję pewnych wyjaśnień.MVVM, WPF i walidacja

Czy ViewModel jest odpowiedzialny za wywoływanie odpowiedniej usługi w celu utrwalenia informacji o modelu?

Jeśli tak, to ViewModel musi mieć czysty sposób określania, czy posiadane dane są poprawne. Jeśli dane są prawidłowe, odpowiednio zaktualizuje model. Ostatecznie, usługa do utrzymywania Modelu jest wywoływana z uwagi na nowo zaktualizowany model. Następnie pytanie brzmi: w jaki sposób możemy sprawdzić informacje ViewModel i wyświetlić to łatwo w widoku?

Widziałem kilka różnych podejść do sprawdzania poprawności. Jeden sugeruje użycie IDataErrorInfo, co moim zdaniem jest absolutnie obrzydliwe.

Innym jest dodanie ValidationRule do Binding.ValidationRules. Jednak przy użyciu tego podejścia nie można działać w kontekście modelu jako całości. Obiekt ValidationRule może wykonywać walidację tylko na pojedynczej wartości. Przykładem może być zapewnienie, że wartość jest liczbą całkowitą lub w pewnym zakresie.

Inną ideą, którą właśnie zacząłem analizować, jest użycie BindingGroup. Ale w tej chwili nie wiem zbyt wiele na ten temat, ponieważ wciąż go czytam.

Chciałbym móc wykonywać logikę walidacji w jednym miejscu do użycia przez View i ViewModel. Oprócz tego wymogu, chciałbym być w stanie wykonać walidacje z dowolną inną wartością w ViewModel. Ponadto jest w stanie uniemożliwić ViewModel utrwalanie danych, jeśli jest on nieprawidłowy. To musi być łatwo odzwierciedlone w widoku.

Jeśli ktoś może wskazać mi jakieś artykuły lub przedstawić pewien wgląd w moje pożądane podejście, byłbym bardzo wdzięczny.

+1

Ciekawe, dlaczego uważasz, że IDataErrorInfo jest obrzydliwe? –

+2

Myślę, że to niewłaściwe użycie indeksera, aby rozpocząć. ViewModel ["Nazwa"] powinien zwrócić nazwę ... nie null/"błąd!". Ograniczasz się także do właściwości, które zostały powiązane w widoku. Nie nadaje się on dobrze do walidatorów, takich jak ValidateNameInformation, gdzie może sprawdzać wszystkie pola. Jeśli jestem źle zrozumiany w tych wypowiedziach, popraw mnie. – Joe

+2

Jednym ze sposobów, w jaki dostaję się na temat nadużycia indeksującego, jest użycie jawnej implementacji interfejsu. W ten sposób nie mam dziwnego "narzędzia indeksującego" zaśmiecającego mój publiczny interfejs ViewModel. Nadal pracuję nad sprawdzaniem poprawności wielu pól przy użyciu MVVM. –

Odpowiedz

2

Dokonujemy sprawdzenia poprawności danych w naszym modelu biznesowym i zezwalamy na zapisywanie tylko wtedy, gdy pozwala na to model biznesowy (ponieważ ma on ważne dane), z perspektywy czasu mogliśmy to zrobić w modelu widoku, jednak oznaczałoby to inne podejście do sprawdzania poprawności dla każdego modelu widoku. i jeśli wyświetlasz te same dane dwa razy na różne sposoby, może być konieczne ponowne zapisanie logiki sprawdzania poprawności.

Wykonujemy isdirty i isValid na prawie każdym polu w warstwie biznesowej, piszemy nasz własny niestandardowy obiekt pola i niestandardowy obcy obiekt referencyjny, który to implementuje. wtedy możemy związać się z tymi właściwościami, aby zobaczyć wizualnie, czy jesteśmy poprawni/zabrudzeni itd. Następnie propogujemy te właściwości za pomocą modelu widoku.

+2

Masz kilka bibliotek, które Ci pomogą, np. Blok aplikacji walidacyjnej (http://msdn.microsoft.com/en-us/library/cc309509.aspx) i CSLA (http://www.lhotka.net/cslanet/) – armannvg