挽星

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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;

        }

 

转自:http://www.hdaccp.com/new.aspx?id=384

posted on 2012-01-31 00:07  挽星  阅读(873)  评论(0编辑  收藏  举报