W WPF można skonfigurować walidację na podstawie błędów zgłaszanych w warstwie danych podczas wiązania danych przy użyciu ExceptionValidationRule
lub DataErrorValidationRule
.
Załóżmy, że masz skonfigurowaną w ten sposób grupę kontrolek i masz przycisk Zapisz. Gdy użytkownik kliknie przycisk Zapisz, przed kontynuowaniem zapisywania upewnij się, że nie ma żadnych błędów sprawdzania poprawności. Jeśli występują błędy walidacji, chcesz je wykrzyczeć.
W WPF, jak sprawdzić, czy którykolwiek z formantów związanych z danymi ma ustawione błędy walidacji?
wpf
validation
data-binding
Kevin Berridge
źródło
źródło
IsValid
funkcję? Widzę, że skonfigurowałeś polecenie,CanExecute
które, jak sądzę, jest powiązane z poleceniem przycisku Zapisz. Czy to zadziała, jeśli nie używam poleceń? A jaki jest związek przycisku z innymi kontrolkami, które należy sprawdzić? Moją jedyną myślą o tym, jak tego użyć, jest wywołanieIsValid
każdej kontrolki, która musi zostać zweryfikowana. Edycja: Wygląda na to, że sprawdzasz,sender
co, jak spodziewam się, będzie przyciskiem zapisywania. Nie wydaje mi się to w porządku.Window
jest również obiektem zależności. Prawdopodobnie konfiguruje go za pomocą jakiegoś programu obsługi zdarzeń wWindow
. Alternatywnie, można po prostu nazwać to bezpośrednioIsValid(this)
zWindow
klasy.Poniższy kod (z książki Programming WPF autorstwa Chrisa Sell'a i Iana Griffithsa) sprawdza poprawność wszystkich reguł wiążących dla obiektu zależności i jego elementów podrzędnych:
Możesz to wywołać w programie obsługi zdarzeń kliknięcia przycisku zapisywania, w ten sposób w swojej stronie / oknie
źródło
Wysłany kod nie działał dla mnie podczas korzystania z ListBox. Przepisałem to i teraz działa:
źródło
Miałem ten sam problem i wypróbowałem dostarczone rozwiązania. Połączenie rozwiązań H-Man2 i skiba_k działało dla mnie prawie dobrze, z jednym wyjątkiem: Moje okno ma TabControl. Reguły walidacji są oceniane tylko dla TabItem, który jest obecnie widoczny. Więc zamieniłem VisualTreeHelper na LogicalTreeHelper. Teraz działa.
źródło
Oprócz świetnej implementacji LINQ Dean, dobrze się bawiłem pakując kod w rozszerzenie dla DependencyObjects:
To sprawia, że jest niezwykle przyjemny, biorąc pod uwagę możliwość ponownego użycia.
źródło
Zaproponowałbym małą optymalizację.
Jeśli zrobisz to wiele razy dla tych samych kontrolek, możesz dodać powyższy kod, aby zachować listę kontrolek, które faktycznie mają reguły walidacji. Następnie, ilekroć chcesz sprawdzić poprawność, przejrzyj tylko te kontrolki, a nie całe drzewo wizualne. Byłoby to znacznie lepsze, gdybyś miał wiele takich kontroli.
źródło
Oto biblioteka do sprawdzania poprawności formularzy w WPF. Pakiet Nuget tutaj .
Próba:
Chodzi o to, że definiujemy zakres walidacji za pomocą dołączonej właściwości, informując ją, jakie kontrolki wejściowe mają śledzić. Wtedy możemy:
źródło
Możesz iterować po wszystkich swoich drzewach kontrolek rekurencyjnie i sprawdzić załączoną właściwość Validation.HasErrorProperty, a następnie skupić się na pierwszej, którą w nim znajdziesz.
możesz też skorzystać z wielu już napisanych rozwiązań możesz sprawdzić w tym wątku przykład i więcej informacji
źródło
Może Cię zainteresować przykładowa aplikacja BookLibrary platformy WPF Application Framework (WAF) . Pokazuje, jak używać walidacji w WPF i jak kontrolować przycisk Zapisz, gdy występują błędy walidacji.
źródło
W formularzu odpowiedzi aogan, zamiast jawnie iterować przez reguły walidacji, lepiej po prostu wywołaj
expression.UpdateSource():
źródło