Najlepsze praktyki w zakresie wiązania danych i zasad walidacji WPF

Mam bardzo prostą aplikację WPF, w której używam powiązania danych, aby umożliwić edycję niektórych niestandardowych obiektów CLR. Chcę teraz wprowadzić weryfikację danych wejściowych, gdy użytkownik kliknie Zapisz. Jednak wszystkie książki WPF, które przeczytałem, tak naprawdę nie poświęcają temu zagadnieniu żadnej przestrzeni. Widzę, że możesz tworzyć niestandardowe zasady walidacji, ale zastanawiam się, czy nie byłoby to przesadą dla moich potrzeb.

Więc moje pytanie jest takie: czy jest gdzieś dobry przykładowy wniosek lub artykuł, który demonstruje najlepsze praktyki walidacji danych wejściowych użytkownika w WPF?

Author: Mark Heath, 2008-09-15

6 answers

Myślę, że nowym preferowanym sposobem może być użycie IDataErrorInfo

Czytaj więcej TUTAJ

 83
Author: rudigrobler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 15:09:12

From MS ' s Patterns & Practices documentation :

Walidacja danych i raportowanie błędów

Twój model widoku lub model często będzie wymagane do przeprowadzenia walidacji danych i sygnalizować walidację danych błędy w widoku, tak aby użytkownik może działać, aby je skorygować.

Silverlight i WPF zapewniają wsparcie do zarządzania błędami walidacji danych które występują przy zmianie indywidualnej właściwości związane z kontrolkami w widoku. Na pojedyncze właściwości które są związane z kontrolą, zobacz model lub model może sygnalizować dane błąd walidacji wewnątrz właściwości setter odrzucając przychodzące złe wartość i rzucenie wyjątku. Jeśli właściwość ValidatesOnExceptions na powiązanie danych jest prawdziwe, dane binding engine w WPF i Silverlight obsłuży wyjątek i wyświetli wizualny sygnał dla użytkownika, że istnieje błąd walidacji danych.

Jednak rzucanie WYJĄTKÓW z właściwości w ten sposób powinny być unikać tam, gdzie to możliwe. Alternatywa podejście polega na wdrożeniu IDataErrorInfo lub INotifyDataErrorInfo interfejsy w modelu widoku lub modelu klasy. Interfejsy te pozwalają na wyświetl model lub model do wykonania danych Walidacja dla jednej lub więcej właściwości wartości i zwrócenie Komunikatu o błędzie do widoku, aby użytkownik mógł być powiadomiony o błędzie.

Dokumentacja wyjaśnia jak zaimplementować IDataErrorInfo i INotifyDataErrorInfo.

 22
Author: Pat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 16:54:35

Osobiście używam WYJĄTKÓW do obsługi walidacji. wymaga następujących kroków:

  1. w wyrażeniu powiązania danych musisz dodać "ValidatesOnException = True"
  2. w obiekcie danych, do którego jesteś przywiązany, musisz dodać obsługę DependencyPropertyChanged, gdzie sprawdzasz, czy nowa wartość spełnia Twoje warunki - jeśli nie - przywracasz do obiektu starą wartość (jeśli musisz) i rzucasz wyjątek.
  3. w szablonie sterowania używanym do wyświetlania nieprawidłowej wartości w kontrolce można uzyskać dostęp do zbierania błędów i wyświetlania komunikatu wyjątku.

Sztuczka polega na tym, aby wiązać tylko obiekty, które pochodzą z DependencyObject. prosta implementacja INotifyPropertyChanged nie zadziała - w frameworku jest błąd, który uniemożliwia dostęp do kolekcji błędów.

 10
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-30 10:39:21

Sprawdź również Ten artykuł . Podobno Microsoft wydał swoją Enterprise Library (v4.0) ze swoich wzorców i praktyk, w których obejmują temat walidacji, ale Bóg wie, dlaczego nie uwzględnili walidacji dla WPF, więc post na blogu, do którego kieruję Cię, wyjaśnia, co autor zrobił, aby go dostosować. Mam nadzieję, że to pomoże!

 3
Author: murki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-15 21:55:36

Być może zainteresuje cię BookLibrary przykładowa aplikacja WPF Application Framework (WAF). Pokazuje jak używać walidacji w WPF i jak sterować przyciskiem Zapisz, gdy występują błędy walidacji.

 2
Author: jbe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-04 16:38:43

Jeśli twoja klasa biznes jest bezpośrednio używana przez twój interfejs użytkownika, preferowane jest użycie IDataErrorInfo, ponieważ stawia logikę bliżej ich właściciela.

Jeśli twoja klasa biznes jest klasą początkową utworzoną przez odniesienie do usługi WCF / XmlWeb, nie możesz / nie możesz używać IDataErrorInfo ani rzucać wyjątku do użytku z ExceptionValidationRule. Zamiast tego możesz:

  • Użyj niestandardowego ValidationRule.
  • Zdefiniuj klasę częściową w projekcie WPF UI i wdrażaj IDataErrorInfo.
 0
Author: Alex Pollan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 08:13:44