Mittwoch, 30. September 2009

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;
   }
}
  • 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