Delen via


Handleiding: Binding-validatie implementeren

In dit voorbeeld ziet u hoe u een ErrorTemplate en een stijltrigger gebruikt om visuele feedback te geven om de gebruiker te informeren wanneer een ongeldige waarde wordt ingevoerd, op basis van een aangepaste validatieregel.

Voorbeeld

De tekstinhoud van de TextBox in het volgende voorbeeld is gebonden aan de eigenschap Age (van het type int) van een bindingsbronobject met de naam ods. De binding is ingesteld voor het gebruik van een validatieregel met de naam AgeRangeRule zodat als de gebruiker niet-numerieke tekens invoert of een waarde die kleiner is dan 21 of groter dan 130, een rood uitroepteken naast het tekstvak wordt weergegeven en er een knopinfo met het foutbericht wordt weergegeven wanneer de gebruiker de muisaanwijzer boven het tekstvak beweegt.

<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>

In het volgende voorbeeld ziet u de implementatie van AgeRangeRule, die wordt overgenomen van ValidationRule en de methode Validate overschrijft. De methode Int32.Parse wordt aangeroepen op de waarde om ervoor te zorgen dat deze geen ongeldige tekens bevat. De methode Validate retourneert een ValidationResult die aangeeft of de waarde geldig is op basis van of een uitzondering wordt opgevangen tijdens het parseren en of de leeftijdswaarde buiten de onder- en bovengrens valt.

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

In het volgende voorbeeld ziet u de aangepaste ControlTemplatevalidationTemplate waarmee een rood uitroepteken wordt gemaakt om de gebruiker op de hoogte te stellen van een validatiefout. Besturingssjablonen worden gebruikt om het uiterlijk van een besturingselement opnieuw te definiƫren.

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

Zoals in het volgende voorbeeld wordt weergegeven, is het ToolTip dat het foutbericht toont gemaakt met behulp van de stijl textBoxInError. Als de waarde van HasError gelijk is aan true, stelt de trigger de tooltips van de huidige TextBox in op de eerste validatiefout. De RelativeSource is ingesteld op Self, wat verwijst naar het huidige 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>

Gegevensobject

Het volgende codefragment is het gegevensobject dat in de vorige codevoorbeelden wordt gebruikt. In de XAML wordt een exemplaar aangemaakt als een statische bron met de sleutel 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

Volledig voorbeeld

Zie bindvalidatievoorbeeldvoor het volledige voorbeeld.

Houd er rekening mee dat als u geen aangepaste ErrorTemplate opgeeft, de standaardfoutsjabloon visuele feedback geeft aan de gebruiker wanneer er een validatiefout optreedt. Zie 'Gegevensvalidatie' in Overzicht van gegevensbinding voor meer informatie. WPF biedt ook een ingebouwde validatieregel die uitzonderingen onderschept die tijdens de update van de bindingsbroneigenschap worden opgeworpen. Zie ExceptionValidationRulevoor meer informatie.

Zie ook