ValidationErrors in xaml Controls

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;
}
}
view raw validationErrors3.cs hosted with ❤ by GitHub
  • 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 ?