Felix  RuthenbergWPF Error Template bei der Validierung


WPF bietet die Möglichkeit beim DataBind Validierung durchzuführen, dazu muss als erstes eine Klasse erstellt werden, die die Validierung durchführt.  Die eigene Validierungsklasse ist abgeleitet von ValidationRule und überschreibt die Methode Validate wie im CodeSnippet gezeigt:

    class NotANumberValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            double d;
            if (double.TryParse(value.ToString(), out d))
                return ValidationResult.ValidResult;
            else return new ValidationResult(false, "Keine Zahl eingegeben");
        }
    }

Im XAML kann als DataBind Eigenschaft ValidationRules die ValidationRule angegeben werden:

<Binding ElementName="txtbxDivision" Path="Text" 
  Converter="{StaticResource divideBy2Converter}"
  UpdateSourceTrigger="PropertyChanged">
  <Binding.ValidationRules>
  <local:NotANumberValidationRule />
  </Binding.ValidationRules>
</Binding>

An dem Control an dem die Daten gebunden werden, kann zu dem ein ErrorTemplate definiert werden, das im Fehlerfall erscheint.  Ist kein derartiges Template definiert wird automatisch ein dünner roter Rahmen um das Control gerendert.  Die Überschreibung des Control Templates sind folgendermaßen aus:

<ControlTemplate x:Key="errorTemplate">
  <DockPanel LastChildFill="True">
    <TextBlock DockPanel.Dock="Right" 
                        Foreground="Red"
                        FontSize="12pt">
                        Fehler
    </TextBlock>
    <Border BorderBrush="Red" BorderThickness="1">
      <AdornedElementPlaceholder />
    </Border>
  </DockPanel>
</ControlTemplate>

Dabei steht der <AdornedElementPlaceholder /> als Platzhalter für das Element, das mit der Fehlermeldung markiert sein soll.  Um dem zu validierenden Element das Template zuzuweisen muss die Validation.ErrorTemplate Eigenschaft angesprochen werden.  Über Property Trigger können zudem noch weitere Aktionen angeworfen werden (siehe textBoxStyle).

Hier also das Anlegen der TextBox:

<TextBox Name="txtbxNumber" Validation.ErrorTemplate="{StaticResource errorTemplate}" Style="{StaticResource textBoxStyle}" >
  <Binding>
    <!-- Hier kommt das Binding wie oben beschrieben rein -->
  </Binding>
</TextBox>

Und der dazugehörige Style:

<Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}">
  <Style.Triggers>
    <Trigger Property="Validation.HasError" Value="true">
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
          Path=(Validation.Errors)[0].ErrorContent}" />
    </Trigger>
  </Style.Triggers>
</Style>

Die Bindung Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" Holt die Validierungsfehlermessage aus der Validierungsklasse und zeigt sie im Tooltip der TextBox an.

Das Projekt (inklusive Konvertierungsbeispiel) kann heruntergeladen werden von:  http://cid-fd4d63530af59c99.skydrive.live.com/self.aspx/.Public/Projekte/WPF/Validierung.zip



Kategorien: .Net;XAML;C#;WPF; 03.07.2009 16:26:53


 


Neuen Kommentar einfügen:

  Titel:   
  Name:
  E-Mail:
  Kommentar:

 
 


Kommentare




© Copyright 2008 ppedv AG