WPF 数据绑定[7]

对于Binding,其自带了两个验证类:ExceptionValidationRule 和 DataErrorValidationRule 。

 

第一部分、ExceptionValidationRule

关于ExceptionValidationRule ,更多的是用于对于数据源属性的绑定的验证,例如一个类型为Datetime的属性Birthday,根据之前的绑定过程:

A、假设绑定是目标属性更新后,会影响数据源属性的值

B、从数据源属性Birthday绑定到目标属性上

C、目标属性在绑定数据后进行转换器的转换

D、目标属性进行转换器之后,由于是TwoWay的绑定模式,所以这时在目标属性更新之后,会在调用数据源属性的Setter赋值之前,利用反射【这个机制不确定】验证输入的字符串的类型是否可以转换成Setter需要的类型,如果value和属性的类型不匹配,则会引发异常,这个异常会通过Validation.Error相关联的事件进行处理

 

对于自定义或者ExceptionValidationRule处理的异常,都是可以使用上一节处理自定义验证信息的过程来处理,也就是:

A、设置Binding的NotifyOnValidationError为true

B、绑定目标控件的Validation.Error事件

C、处理这个事件的消息参数e

 

只有目标属性的更新会影响到数据源属性的时候,所有的验证才会生效,也就是说如果只是从数据源绑定数据,不会进行任何验证。

 

第二部分、DataErrorValidationRule 【3.5新增】

DataErrorValidationRule主要是用于数据调用了Setter之后,并通过Setter赋值,对数据的内容进行验证。

 

也就是说,DataErrorValidationRule 和 ExceptionValidationRule 的区别在于

A、ExceptionValidationRule 用于处理数据格式的异常,也就是用户输入的数据不符合属性的类型,例如为整型的属性赋予一个包含非数字的字符,如果格式不正确,Setter将不会将新的值赋予属性。

B、DataErrorValidationRule 用于处理数据内容的异常,当然,这个什么内容属于异常还是由编程者决定的,也就是说当数据要经过DataErrorValidationRule 的时候,它的格式一定是正确的,但是就算内容属于异常,其新的值仍然赋予了属性。

 

1、要使用内容验证的DataErrorValidationRule,只要将数据源的自定义类再继承一个接口IDataErrorInfo即可,具体代码如下:

 

2、XAML代码如下:

 

在这里,同时使用了ExceptionValidationRule 、DataErrorValidationRule以及自定义的CustomizeValidationRule。

 

3、而CustomizeValidationRule的代码如下:

 

从实际的操作结果看,三个验证的顺序是:

CustomizeValidationRule -> ExceptionValidationRule  -> DataErrorValidationRule

 

可见,自定义的验证类的优先级别是最高的,因此其实对于ExceptionValidationRule  以及 DataErrorValidationRule的验证过程,都可以放在自定义的验证类中完成。

 

疑问:

当给整形属性赋值的时候,如果使用中文将导致空指针异常;但是如果将NotifyOnValidationError设置成false时候,则不会。

怀疑:

1、要添加Error的时候出现错误。

2、由于使用的是UpdateSourceTrigger="PropertyChanged",而输入中文的时候需要点击字母键 + 回车或者空格,导致错误。

 

具体过程,假设,属性类型是整形,初始数据是0

1、在文本框输入0,验证通过,调用Setter,数据源被更新为00

2、输入随意输入中文字,验证不通过,不调用Setter,返回Error,并处理Validation.Error的事件

3、抛出空指针异常,System.Windows.Documents.TextParentUndoUnit.RecordRedoSelectionState(ITextPointer anchorPosition, ITextPointer movingPosition)<- 抛出异常的方法

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值