本篇我们讨论SL3中的数据验证相关知识。
数据验证只会发生双向绑定的情况下,因为实体类需要实现INotifyPropertyChanged接口。在SL中数据绑定的时候如果遇到没有验证的数据,通常会忽略它。下面的表中,列出在双向绑定的时候,三种类型的错误:
1、不正确的数据。例如:本来是应该数字类型的,不应该输入字符或者其他字符,同时,也不能超出最大值。
2、对象属性的set异常。例如:在属性Id的set中有一个判断,如果有问题就抛出异常。
3、只读属性,你不能进行赋值操作。
如果是上面的错误,你不能忽略他们,因为sl的数据绑定不会给你任何可视化的提示信息。不正确的值保留在绑定控件中,但是没有应用到绑定对象中。
避免这个问题的好办法就是及时的提醒用户,输入有问题。最容易的途径包括:使用绑定对象的两个属性,ValidatesOnExceptions、NotifyOnValidationError,这些都会激活sl的错误提醒事件。
1、ValidatesOnException
ValidatesOnException是实现其他验证的第一步。在你设置ValidatesOnException=true之后,数据绑定将会对任何错误做出响应,不管它是出现在类型转换还是属性的setter。但是,当设置ValidatesOnException=false(默认为 false)之后,数据绑定不会提示任何错误。绑定对象没有被更新,错误的值保留在了绑定控件中。
下面是绑定控件的设置例子
<TextBox x:Name="customerId" Grid.Column="1" Grid.Row="1" Text="{Binding CustomerId, Mode=TwoWay, ValidatesOnExceptions=true}"></TextBox>
这样设置之后,你的控件在双向绑定之后可以进行捕获和显示错误的能力,具有这种能力的控件包括。
* TextBox
* PasswordBox
* CheckBox
* RadioButton
* ListBox
* ComboBox
知识点:验证状态ValidationState包括三种:Valid、InvalidUnfocused、InvalidFocused。
这里我们再一个属性的setter中添加验证,
代码
public virtual int CustomerId
{
get { return this._intCustomerId; }
set
{
int result;
if (Int32.TryParse(value.ToString(), out result) == false)
throw new ArgumentException("必须是数字");
this._intCustomerId = result;
OnPropertyChanged("CustomerId");
}
}