Procédure : Implémenter une logique de validation sur des objets personnalisésHow to: Implement Validation Logic on Custom Objects

Cet exemple montre comment implémenter une logique de validation sur un objet personnalisé, puis lier à ce dernier.This example shows how to implement validation logic on a custom object and then bind to it.

ExempleExample

Vous pouvez fournir la logique de validation sur la couche métier si votre objet source implémente IDataErrorInfo, comme dans l’exemple suivant, qui définit un Person objet qui implémente IDataErrorInfo:You can provide validation logic on the business layer if your source object implements IDataErrorInfo, as in the following example, which defines a Person object that implements IDataErrorInfo:

public class Person : IDataErrorInfo
{
    private int age;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public string Error
    {
        get
        {
            return null;
        }
    }

    public string this[string name]
    {
        get
        {
            string result = null;

            if (name == "Age")
            {
                if (this.age < 0 || this.age > 150)
                {
                    result = "Age must not be less than 0 or greater than 150.";
                }
            }
            return result;
        }
    }
}
Public Class Person
    Implements IDataErrorInfo

    Private _age As Integer
    Public Property Age() As Integer
        Get
            Return _age
        End Get
        Set(ByVal value As Integer)
            _age = value
        End Set
    End Property

    Public ReadOnly Property [Error]() As String Implements IDataErrorInfo.Error
        Get
            Return Nothing
        End Get
    End Property

    Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements IDataErrorInfo.Item
        Get
            Dim result As String = Nothing

            If columnName = "Age" Then
                If Me._age < 0 OrElse Me._age > 150 Then
                    result = "Age must not be less than 0 or greater than 150."
                End If
            End If
            Return result
        End Get
    End Property
End Class

Dans l’exemple suivant, la propriété de texte de la zone de texte est liée à la Person.Age propriété, qui a été rendue disponible pour une liaison via une déclaration de ressource qui reçoit le x:Key data.In the following example, the text property of the text box binds to the Person.Age property, which has been made available for binding through a resource declaration that is given the x:Key data. Le DataErrorValidationRule vérifie les erreurs de validation déclenchés par le IDataErrorInfo implémentation.The DataErrorValidationRule checks for the validation errors raised by the IDataErrorInfo implementation.

<Window x:Class="BusinessLayerValidation.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="WPF IDataErrorInfo Sample" Width="350" Height="150"
        xmlns:src="clr-namespace:BusinessLayerValidation">
    
    <Window.Resources>
        <src:Person x:Key="data"/>

        <!--The tool tip for the TextBox to display the validation error message.-->
        <Style x:Key="textBoxInError" TargetType="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>
    </Window.Resources>

    <StackPanel Margin="20">
        <TextBlock>Enter your age:</TextBlock>

        <TextBox Style="{StaticResource textBoxInError}">
            <TextBox.Text>
                <!--By setting ValidatesOnExceptions to True, it checks for exceptions
                that are thrown during the update of the source property.
                An alternative syntax is to add <ExceptionValidationRule/> within
                the <Binding.ValidationRules> section.-->
                <Binding Path="Age" Source="{StaticResource data}"
                         ValidatesOnExceptions="True"
                         UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <!--DataErrorValidationRule checks for validation 
                            errors raised by the IDataErrorInfo object.-->
                        <!--Alternatively, you can set ValidationOnDataErrors="True" on the Binding.-->
                        <DataErrorValidationRule/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>

        <TextBlock>Mouse-over to see the validation error message.</TextBlock>
    </StackPanel>
</Window>

Vous pouvez également, au lieu d’utiliser le DataErrorValidationRule, vous pouvez définir le ValidatesOnDataErrors propriété true.Alternatively, instead of using the DataErrorValidationRule, you can set the ValidatesOnDataErrors property to true.

Voir aussiSee also