Validation auf xaml-controls findet man "überall" im Netz.. z.B. kann man das so machen:
<Binding Path="Person"
Mode="TwoWay">
<Binding.ValidationRules>
<ui:PersonValidationRule />
</Binding.ValidationRules>
</Binding>
Nun habe ich aber keine möglichkeit auf einem Window sowas zu machen wie
Window.ChildsHaveErrors(). Aus dieser Lage hilft das Folgende:
<Window [blah...]
Validation.Error="ValidationError">
<Binding Path="Person"
Mode="TwoWay"
NotifyOnValidationError="True">
<Binding.ValidationRules>
<ui:PersonValidationRule />
</Binding.ValidationRules>
</Binding>
und im Code-Behind:
private int errorsInForm;
private void ValidationError(object sender, ValidationErrorEventArgs e)
{
switch (e.Action)
{
case ValidationErrorEventAction.Added:
this.errorsInForm++;
break;
case ValidationErrorEventAction.Removed:
this.errorsInForm--;
break;
}
}
private bool WindowHasErrors
{
get
{
return this.errorsInForm>0;
}
}
- Auf der Window-Deklaration im xaml den Validation.Error-Event setzten (Validation.Error ist übrigens eine "attached dependency property", sollte also auf fast allen Elementen funktionieren...)
- Auf der Binding-Deklaration NotifyOnValidationError auf true setzen, damit wird der Fehler aus dem eigentlichen Element auf dem dieser entsteht hinaus "gebubbelt" (z.B. bis zum Window...)
- Im Code-Behind, im ValidationError-EventHandler werden einfach die entstandenen Fehler gezählt (ValidationErrorEventAction.Removed ist ein "ehemaliger Fehler"...)
- In WindowHasError wird dann nur noch geprüft, ob die aktuelle Zahl der Fehler größer ist als 0.
Meinungen dazu ?
Keine Kommentare:
Kommentar veröffentlichen