In WPF können Sie die Validierung basierend auf Fehlern einrichten, die während der Datenbindung mit ExceptionValidationRule
oder in Ihrer Datenschicht ausgelöst wurden DataErrorValidationRule
.
Angenommen, Sie haben eine Reihe von Steuerelementen auf diese Weise eingerichtet und eine Schaltfläche Speichern. Wenn der Benutzer auf die Schaltfläche Speichern klickt, müssen Sie sicherstellen, dass keine Validierungsfehler vorliegen, bevor Sie mit dem Speichern fortfahren. Wenn es Validierungsfehler gibt, möchten Sie diese anschreien.
Wie können Sie in WPF herausfinden, ob für eines Ihrer datengebundenen Steuerelemente Validierungsfehler festgelegt wurden?
quelle
IsValid
Funktion? Ich sehe, dass Sie eine eingerichtet haben,CanExecute
die vermutlich mit dem Befehl der Schaltfläche Speichern zusammenhängt. Funktioniert das, wenn ich keine Befehle verwende? Und in welcher Beziehung steht die Schaltfläche zu den anderen Steuerelementen, die überprüft werden müssen? Mein einziger Gedanke, wie diese zu verwenden , ist durch den AufrufIsValid
für jede Kontrolle , dass der Bedarf validiert werden. Bearbeiten: Es scheint, als würden Sie das überprüfen,sender
was ich als Speicherschaltfläche erwarte. Das scheint mir nicht richtig zu sein.Window
ist auch ein Abhängigkeitsobjekt. Ich, er richtet es wahrscheinlich mit einer Art Event-Handler auf der einWindow
. Alternativ können Sie es auch direkt mitIsValid(this)
aus derWindow
Klasse aufrufen .Der folgende Code (aus dem Programming WPF-Buch von Chris Sell & Ian Griffiths) überprüft alle Bindungsregeln für ein Abhängigkeitsobjekt und seine untergeordneten Objekte:
Sie können dies in Ihrer Schaltfläche zum Klicken auf die Schaltfläche "Ereignisbehandlungsroutine" auf Ihrer Seite / Ihrem Fenster aufrufen
quelle
Der veröffentlichte Code hat bei Verwendung einer ListBox bei mir nicht funktioniert. Ich habe es umgeschrieben und jetzt funktioniert es:
quelle
Hatte das gleiche Problem und versuchte die bereitgestellten Lösungen. Eine Kombination der Lösungen von H-Man2 und skiba_k hat für mich fast gut funktioniert, mit einer Ausnahme: Mein Fenster verfügt über ein TabControl. Die Validierungsregeln werden nur für das derzeit sichtbare TabItem ausgewertet. Also habe ich VisualTreeHelper durch LogicalTreeHelper ersetzt. Jetzt gehts.
quelle
Zusätzlich zur großartigen LINQ-Implementierung von Dean hatte ich Spaß daran, den Code in eine Erweiterung für DependencyObjects zu packen:
Dies macht es sehr schön, wenn man die Wiederverwendbarkeit berücksichtigt.
quelle
Ich würde eine kleine Optimierung anbieten.
Wenn Sie dies mehrmals über dieselben Steuerelemente tun, können Sie den obigen Code hinzufügen, um eine Liste der Steuerelemente zu führen, für die tatsächlich Validierungsregeln gelten. Wenn Sie dann die Gültigkeit überprüfen müssen, gehen Sie nur diese Steuerelemente anstelle des gesamten visuellen Baums durch. Dies würde sich als viel besser erweisen, wenn Sie viele solcher Steuerelemente haben.
quelle
Hier ist eine Bibliothek zur Formularvalidierung in WPF. Nuget-Paket hier .
Stichprobe:
Die Idee ist, dass wir einen Validierungsbereich über die angehängte Eigenschaft definieren und ihm mitteilen, welche Eingabesteuerelemente verfolgt werden sollen. Dann können wir tun:
quelle
Sie können alle Steuerelemente rekursiv durchlaufen und die angehängte Eigenschaft Validation.HasErrorProperty überprüfen. Konzentrieren Sie sich dann auf die erste, die Sie darin finden.
Sie können auch viele bereits geschriebene Lösungen verwenden. In diesem Thread finden Sie ein Beispiel und weitere Informationen
quelle
Möglicherweise interessieren Sie sich für die BookLibrary- Beispielanwendung des WPF Application Framework (WAF) . Es wird gezeigt, wie die Validierung in WPF verwendet wird und wie die Schaltfläche Speichern gesteuert wird, wenn Validierungsfehler vorliegen.
quelle
In Antwortform aogan, anstatt explizit durch Validierungsregeln zu iterieren, besser einfach aufrufen
expression.UpdateSource():
quelle