Comment : implémenter la validation de la liaisonHow to: Implement Binding Validation

Cet exemple montre comment utiliser un ErrorTemplate et un déclencheur de style pour fournir des commentaires visuels afin d’informer l’utilisateur lorsqu’une valeur non valide est entrée, en fonction d’une règle de validation personnalisée.This example shows how to use an ErrorTemplate and a style trigger to provide visual feedback to inform the user when an invalid value is entered, based on a custom validation rule.

ExempleExample

Le contenu de texte de l' TextBox dans l’exemple suivant est lié à la propriété Age (de type int) d’un objet de source de liaison nommé ods.The text content of the TextBox in the following example is bound to the Age property (of type int) of a binding source object named ods. La liaison est configurée pour utiliser une règle de validation nommée AgeRangeRule afin que si l’utilisateur entre des caractères non numériques ou une valeur inférieure à 21 ou supérieure à 130, un point d’exclamation rouge apparaisse en regard de la zone de texte et une info-bulle contenant le message d’erreur s’affiche lorsque l’utilisateur déplace la souris sur la zone de texte.The binding is set up to use a validation rule named AgeRangeRule so that if the user enters non-numeric characters or a value that is smaller than 21 or greater than 130, a red exclamation mark appears next to the text box and a tool tip with the error message appears when the user moves the mouse over the text box.

<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>
        <c:AgeRangeRule Min="21" Max="130"/>
      </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>

L’exemple suivant illustre l’implémentation de AgeRangeRule, qui hérite de ValidationRule et substitue la méthode Validate.The following example shows the implementation of AgeRangeRule, which inherits from ValidationRule and overrides the Validate method. La méthode Int32.Parse est appelée sur la valeur pour s’assurer qu’elle ne contient pas de caractères non valides.The Int32.Parse method is called on the value to make sure that it does not contain any invalid characters. La méthode Validate retourne une ValidationResult qui indique si la valeur est valide selon qu’une exception est interceptée pendant l’analyse et si la valeur d’âge est en dehors des limites inférieure et supérieure.The Validate method returns a ValidationResult that indicates if the value is valid based on whether an exception is caught during the parsing and whether the age value is outside of the lower and upper bounds.

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

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

        try
        {
            if (((string)value).Length > 0)
                age = Int32.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

L’exemple suivant montre le validationTemplate ControlTemplate personnalisé qui crée un point d’exclamation rouge pour notifier l’utilisateur d’une erreur de validation.The following example shows the custom ControlTemplate validationTemplate that creates a red exclamation mark to notify the user of a validation error. Les modèles de contrôle sont utilisés pour redéfinir l’apparence d’un contrôle.Control templates are used to redefine the appearance of a control.

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

Comme indiqué dans l’exemple suivant, la ToolTip qui affiche le message d’erreur est créée à l’aide du style nommé textBoxInError.As shown in the following example, the ToolTip that shows the error message is created using the style named textBoxInError. Si la valeur de HasError est true, le déclencheur affecte à l’info-bulle de la TextBox actuelle la première erreur de validation.If the value of HasError is true, the trigger sets the tool tip of the current TextBox to its first validation error. La RelativeSource est définie sur Self, en faisant référence à l’élément actuel.The RelativeSource is set to Self, referring to the current 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)/ErrorContent}"/>
    </Trigger>
  </Style.Triggers>
</Style>

Pour obtenir un exemple complet, consultez exemple de validation de liaison.For the complete example, see Bind Validation sample.

Notez que si vous ne fournissez pas de ErrorTemplate personnalisé, le modèle d’erreur par défaut apparaît pour fournir des commentaires visuels à l’utilisateur en cas d’erreur de validation.Note that if you do not provide a custom ErrorTemplate the default error template appears to provide visual feedback to the user when there is a validation error. Pour plus d’informations, consultez la section relative à la validation de données de la rubrique Vue d’ensemble de la liaison de données.See "Data Validation" in Data Binding Overview for more information. En outre, WPFWPF fournit une règle de validation intégrée qui capte les exceptions levées pendant la mise à jour de la propriété de source de liaison.Also, WPFWPF provides a built-in validation rule that catches exceptions that are thrown during the update of the binding source property. Pour plus d'informations, consultez ExceptionValidationRule.For more information, see ExceptionValidationRule.

Voir aussiSee also