深入剖析WPF数据验证

本文深入探讨了WPF的数据验证机制,包括ValidationStep属性的作用,UI上显示错误信息的方法,以及ExceptionValidationRule、DataErrorValidationRule和INotifyDataErrorInfo等验证方式的使用。同时,强调了在实际项目中,IDataErrorInfo和INotifyDataErrorInfo通常作为首选的验证实现方式。
摘要由CSDN通过智能技术生成

1、WPF包含的验证方式

方式

父类

对应接口

处理方式

简便写法

默认值

ExceptionValidationRule 

ValidationRule

检查在更新数据源(Source)时抛出的异常

ValidatesOnExceptions=True

false

DataErrorValidationRule

ValidationRule

IDataErrorInfo

检查实现了IDataError接口的对象生成的错误

ValidatesOnDataErrors=True

false

NotifyDataErrorValidationRule

ValidationRule

INotifyDataErrorInfo

检查实现了INotifyDataErrorInfo接口的对象生成的错误

ValidatesOnNotifyDataErrors=True

true

说明:

1、如果一个Binding的ValidationRules设置了ExceptionValidationRule或在Binding中直接指定ValidateOnException=true,那么它捕获属性中抛出的异常,参照下面的详细示例

2、对应的如果一个Binding的ValidationRules设置了DataErrorValidationRule或NotifyDataErrorValidationRule,或直接在Binding中指定ValidateOnDataError或ValidateOnNotifyDataErrors,那么它捕获实现对应接口的错误

2、ValidationStep属性,默认是:RawProposedValue,对于DataErrorValidationRule来说,默认是UpdatedValue

<ExceptionValidationRule ValidationStep="RawProposedValue" />
    //
    // Summary:
    //     确定何时执行ValidationRule
    public enum ValidationStep
    {
        //
        // Summary:
        //     在数据没有转换之前(应用Converter)之前执行ValidationRule
        RawProposedValue = 0,
        //
        // Summary:
        //     在数据转换发生之后,赋值给source之前执行ValidationRule
        ConvertedProposedValue = 1,
        //
        // Summary:
        //     在source的值更新之后执行ValidationRule
        UpdatedValue = 2,
        //
        // Summary:
        //     在数据提交之后执行ValidationRule
        CommittedValue = 3
    }

3、在UI上显示错误信息

  • 指定Validation.ErrorTemplate(AdornedElementPlaceholder是输入控件,如TextBox的占位符)

        <ControlTemplate x:Key="validationTemplate">
            <DockPanel>
                <TextBlock Foreground="Red"  FontSize="20">!</TextBlock>
                <AdornedElementPlaceholder/>
            </DockPanel>
        </ControlTemplate>
  • 使用Style指定错误样式
        <Style x:Key="textStyleTextBox" TargetType="TextBox">
            <Setter Property="Foreground" Value="#333333" />
            <Setter Property="MaxLength" Value="40" />
            <Setter Property="Width" Value="392" />
            <Style.Triggers>
                <Trigger Property="Validation.HasError"  Value="true">
                    <Setter Property="ToolTip" Value="{Binding  RelativeSource={RelativeSource Self},  Path=(Validation.Errors)[0].ErrorContent}" />
                </Trigger>
            </Style.Triggers>
        </Style>

4、Validation处理过程

数据验证发生在TwoWay和OneWayToSource的Binding中

验证流程(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值