Freigeben über


Gewusst wie: Implementieren der Bindungsvalidierung

Dieses Beispiel veranschaulicht die Verwendung einer ErrorTemplate und eines Stiltriggers zum Bereitstellen von visuellem Feedback, um Benutzer*innen zu benachrichtigen, wenn basierend auf einer benutzerdefinierten Validierungsregel ein ungültiger Wert eingegeben wird.

Beispiel

Der Textinhalt des TextBox im folgenden Beispiel ist an die Age-Eigenschaft (vom Typ „int“) eines Bindungsquellenobjekts mit dem Namen ods gebunden. Die Bindung ist so eingerichtet, dass die Validierungsregel mit AgeRangeRule verwendet wird. Wenn der Benutzer ein nicht numerisches Zeichen oder einen Wert kleiner als 21 oder größer als 130 eingibt, werden neben dem Textfeld ein rotes Ausrufezeichen und eine QuickInfo mit einer Fehlermeldung angezeigt, sobald der Mauszeiger über das Textfeld bewegt wird.

<TextBox Name="textBox1" Width="50" FontSize="15"
         Validation.ErrorTemplate="{StaticResource validationTemplate}"
         Style="{StaticResource textBoxInError}"
         Grid.Row="1" Grid.Column="1" Margin="2">
  <TextBox.Text>
    <Binding Path="Age" Source="{StaticResource ods}"
             UpdateSourceTrigger="PropertyChanged" >
      <Binding.ValidationRules>
        <local:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

Das folgenden Beispiel zeigt die Implementierung der AgeRangeRule, die von ValidationRule erbt und die Validate-Methode überschreibt. Die Int32.Parse-Methode wird für den Wert aufgerufen, um sicherzustellen, dass keine ungültigen Zeichen enthalten sind. Die Validate-Methode gibt ein ValidationResult zurück, das angibt, ob der Wert gültig ist. Das Ergebnis basiert darauf, ob während der Analyse eine Ausnahme ausgelöst wird und ob der Alterswert außerhalb der Unter- und Obergrenzen liegt.

public class AgeRangeRule : ValidationRule
{
    public int Min { get; set; }
    public int Max { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = int.Parse((String)value);
        }
        catch (Exception e)
        {
            return new ValidationResult(false, $"Illegal characters or {e.Message}");
        }

        if ((age < Min) || (age > Max))
        {
            return new ValidationResult(false,
              $"Please enter an age in the range: {Min}-{Max}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

Das folgende Beispiel zeigt die benutzerdefinierte ControlTemplatevalidationTemplate, mit der ein rotes Ausrufezeichen erstellt wird, das Benutzer auf einen Fehler bei der Validierung hinweist. Steuerelementvorlagen werden verwendet, um die Darstellung eines Steuerelements neu zu definieren.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Wie im folgenden Beispiel gezeigt, wird der ToolTip mit der Fehlermeldung im textBoxInError-Stil erstellt. Wenn HasError den Wert true aufweist, legt der Trigger die QuickInfo des aktuellen TextBox auf den ersten Validierungsfehler fest. Die RelativeSource wird auf Self festgelegt und verweist damit auf das aktuelle Element.

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

Datenobjekt

Der folgende Codeausschnitt ist das Datenobjekt, das in den vorherigen Codebeispielen verwendet wird. Eine Instanz wird im XAML-Code als statische Ressource mit dem Schlüssel von ods:

public class MyDataSource
{
    public MyDataSource()
    {
        Age = 0;
        Age2 = 0;
    }

    public int Age { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
}
Public Class MyDataSource
    Public Sub New()
        Me.Age = 0
        Me.Age2 = 0
    End Sub

    Public Property Age As Integer
    Public Property Age2 As Integer
    Public Property Age3 As Integer
End Class

Vollständiges Beispiel

Das vollständige Beispiel finden Sie unter Beispiel für Bindungsvalidierung.

Beachten Sie Folgendes: Wenn Sie kein benutzerdefiniertes ErrorTemplate bereitstellen, wird den Benutzer*innen durch die standardmäßige Fehlervorlage visuelles Feedback gegeben, wenn ein Validierungsfehler vorliegt. Weitere Informationen finden Sie unter „Datenvalidierung“ in Übersicht über die Datenbindung. WPF bietet außerdem eine integrierte Validierungsregel, die die während der Aktualisierung der Bindungsquelleneigenschaft ausgelösten Ausnahmen abfängt. Weitere Informationen finden Sie unter ExceptionValidationRule.

Siehe auch