4.1 Silverlight中数据验证
4.1.1 ValidatesOnExceptions异常捕获验证机制
Silverlight对于双向数据绑定提供了一些基本的数据验证支持,我们可以在set设置器中定义验证规则,并对于不合法数据抛出异常,最后通过捕获验证错误事 件来实现数据的验证。
Silverlight中如下两种情况下,将会触发验证错误:
1.在绑定引擎中执行数据转换时抛出异常
2.在业务实体的set设置器中抛出异常
BindingValidationError事件
当数据验证错误出现时,将绑定该错误到数据源;也可以简单的理解为绑定错误到数据源的一个行为。该事件可在控件本身调用,也可在其父控件中调用。例如,在TextBox中,可以声明调用BindingValidationError,或者可以该TextBox的父容器控件Grid,StackPanel中调用BindingValidationError事件。
为了保证Validation的灵活性,微软同时提供了相关属性,来控制BindingValidationError事件的调用。NotifyOnValidationError和ValidatesOnExceptions属性。
为了在验证出错时能够接收到通知,我们必须要在绑定对象上设置如下两个属性为true:
NotifyOnValidationError属性
该属性的功能,是当验证错误出现时是否激活BindingValidationError事件;该属性是Silverlight独有的验证属性之一,经常和ValidatesOnExceptions属性配合使用。
ValidatesOnExceptions属性
该属性的功能,数据绑定引擎是否捕获显示异常错误作为验证错误。简单的理解,在控件绑定数据时,出现数据源异常抛出,或者数据类型转换时异常抛出,是否作为Validation验证显示在客户端。如果是True,则会按照Validation传统的处理方式,弹出一个红色说明标签,内容是异常错误信息,反之,则不捕获异常作为Validation。
依然用上一章中得Student类作为示例,在此示例中我们将绑定方式改为TwoWay,同时设置NotifyOnValidationError和ValidatesOnExceptions属性为True,并添加BindingValidationError事件代码如下:
<TextBox Grid.Column="1" Text="{Binding Name,Mode=TwoWay,NotifyOnValidationError=True,ValidatesOnExceptions=True}" BindingValidationError="txtName_BindingValidationError" Name="txtName" />
修改Student类的Name属性如下:
private string name;
public string Name
{
get { return name; }
set
{
if (string.IsNullOrEmpty(value))
{
throw new Exception("用户名不能为空!");
}
name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
CS代码如下:
private void txtName_BindingValidationError(object sender, ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
MessageBox.Show(e.Error.Exception.Message);
}
if (e.Action == ValidationErrorEventAction.Removed)
{
}
}
说明:
ValidationErrorEventAction.Added 产生错误
ValidationErrorEventAction.Removed 移除错误
4.1.2 Silverlight DataAnnotation验证机制
请参见MVC课程中相关章节,注释相同,只是用法上有一点差别,需要在Set中加入如下代码:
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Name" });
4.2 使用WebService
4.2.1 回顾WebService相关知识
4.2.2 在Silverlight中使用WebServic
1. 创建WebService
[WebMethod]
public List<Student> GetStuList()
{
return new List<Student>
{
new Student{ Name="张三",Age=20},
new Student{ Name="李四",Age=30}
};
}
2. 添加对WebService的引用
3. 调用WebService方法
//创建引用对象,注意此处与以前的区别
StudentService.StuServiceSoapClient stus = new StudentService.StuServiceSoapClient();
//在Silverlight中调用WebService是异步调用的,在此需要完成调用完成的事件
stus.GetStuListCompleted += new EventHandler< StudentService.GetStuListCompletedEventArgs>(stus_GetStuListCompleted);
//调用WebService中提供的方法
stuxs.GetStuListAsync();
void stuxs_GetStuListCompleted(object sender, StudentService.GetStuListCompletedEventArgs e)
{
List< StudentService.Student> list = new List< StudentService.Student>();
ObservableCollection< StudentService.Student> ss = e.Result;
foreach (var s in ss)
{
list.Add(s);
}
this.dataGrid1.ItemsSource = list;
}