Dela via


Så här implementerar du valideringslogik för anpassade objekt

Det här exemplet visar hur du implementerar valideringslogik på ett anpassat objekt och sedan binder till det.

Exempel

Du kan ange valideringslogik på affärsskiktet om källobjektet implementerar IDataErrorInfo, som i följande exempel, som definierar ett Person objekt som implementerar 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

I följande exempel binds textegenskapen för textrutan till egenskapen Person.Age, som har gjorts tillgänglig för bindning genom en resursdeklaration tilldelad x:Keydata. DataErrorValidationRule söker efter valideringsfelen som genereras av IDataErrorInfo implementeringen.

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

I stället för att använda DataErrorValidationRulekan du ange egenskapen ValidatesOnDataErrors till true.

Se även