原文地址:http://www.cnblogs.com/PerfectSoft/archive/2012/03/01/2375007.html

在Silverlight中,数据实体类的有效性校验有多种方法,比如说:运用TargetNullValue、FailBackValue、ValidatesOnExceptions.....,运用这些方法可以解决常见的问题,但是针对一些复杂性的数据校验,显然不是最有效的利器。比如说:在针对单个属性进行多重有效性验证的情况下,此时,可以灵活的运用INotifyDataErrorInfo接口。

MSDN INotifyDataErrorInfor的定义如下:

    // Summary://     Defines members that data entity classes can implement to provide custom,//     asynchronous validation support.    public interface INotifyDataErrorInfo    {// Summary://     Gets a value that indicates whether the object has validation errors.//// Returns://     true if the object currently has validation errors; otherwise, false.        bool HasErrors { get; }

// Summary://     Occurs when the validation errors have changed for a property or for the//     entire object.        event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

// Summary://     Gets the validation errors for a specified property or for the entire object.//// Parameters://   propertyName://     The name of the property to retrieve validation errors for, or null or System.String.Empty//     to retrieve errors for the entire object.//// Returns://     The validation errors for the property or object.        IEnumerable GetErrors(string propertyName);    }
复制代码

从INotifyDataErrorInfo的定义,就能够了解到它的作用。数据实体类可以继承INotifyDataErrorInfo,实现满足业务需求的有效性校验。下面以Student实体类实现INotifyDataErrorInfo接口为例。

Student定义:

    public class Student : INotifyPropertyChanged,INotifyDataErrorInfo    {//存放错误信息,一个Property可能对应多个错误信息        private Dictionary<string, List<string>> errors = new Dictionary<string, List<string>>();
        //实现INotifyPropertyChanged        public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(PropertyChangedEventArgs e)        {if (PropertyChanged != null)            {                PropertyChanged(this, e);            }        }
        //实现INotifyDataErrorInfo        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

public IEnumerable GetErrors(string propertyName)        {if (string.IsNullOrEmpty(propertyName))            {return null;            }else            {if (errors.ContainsKey(propertyName))                {return errors[propertyName];                }            }return null;        }

public bool HasErrors        {get            {return (errors.Count > 0);            }        }

private void SetErrors(string propertyName, List<string> propertyErrors)        {            errors.Remove(propertyName);            errors.Add(propertyName, propertyErrors);if (ErrorsChanged != null)            {                ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));            }        }

private void ClearErrors(string propertyName)        {            errors.Remove(propertyName);if (ErrorsChanged != null)            {                ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));            }        }

private string name;private int age;

public String Name        {get            {return name;            }set            {                name = value;                List<string> errors = new List<string>();bool valid = true;

//数据校验                  if (name.Trim().Contains(" "))                {                    errors.Add("姓名中不能包含空格");                    valid = false;                }if (name.Length < 2 || name.Length > 4)                {                    errors.Add("姓名的长度不能低于2高于4");                    valid = false;                }

if (!valid)                {                    SetErrors("Name", errors);                }else                {                    ClearErrors("Name");                }            }        }

public int Age        {get            {return age;            }set            {                age = value;if (age < 0 || age > 150)                {                    List<string> errors = new List<string>();                    errors.Add("年龄不能小于0或大于150");                    SetErrors("Age", errors);                }else                {                    ClearErrors("Age");                }            }        }    }
复制代码

在MainPage XAML代码中,执行数据绑定时,必须设置ValidatesOnNotifyDataErrors = True。

<Grid x:Name="LayoutRoot" Background="White" BindingValidationError="LayoutRoot_BindingValidationError">        <Grid.RowDefinitions>            <RowDefinition Height="40"></RowDefinition>            <RowDefinition Height="40"></RowDefinition>            <RowDefinition Height="40"></RowDefinition>            <RowDefinition Height="Auto"></RowDefinition>        </Grid.RowDefinitions>        <Grid.ColumnDefinitions>            <ColumnDefinition></ColumnDefinition>            <ColumnDefinition></ColumnDefinition>        </Grid.ColumnDefinitions>        <TextBlock Text="姓名:" HorizontalAlignment="Right" VerticalAlignment="Center"></TextBlock>        <TextBox x:Name="txtName" Text="{Binding Name, Mode=TwoWay, ValidatesOnExceptions=True,             ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" Width="150" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center">        </TextBox>        <TextBlock Text="年龄:" HorizontalAlignment="Right" Grid.Row="1" VerticalAlignment="Center"></TextBlock>        <TextBox x:Name="txtAge" Text="{Binding Age, Mode=TwoWay, ValidatesOnExceptions=True,             ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" Width="150" Grid.Column="1" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center">        </TextBox>        <Button x:Name="Submit" Content="Submit The Data" HorizontalAlignment="Left" Grid.Row="2" Grid.Column="1" Click="Submit_Click" VerticalAlignment="Center"></Button>        <TextBlock x:Name="Summary" Text="无任何错误信息" VerticalAlignment="Center" Grid.Column="1" Grid.Row="3"></TextBlock>    </Grid>
复制代码

MainPage 后台代码:

        public MainPage()        {            InitializeComponent();

            Student product = new Student();            LayoutRoot.DataContext = product;        }

private void LayoutRoot_BindingValidationError(object sender, ValidationErrorEventArgs e)        {//可能没有Exception,但是存在错误信息            if (e.Error.Exception != null)            {//异常处理代码            }else            {                Summary.Text = e.Error.ErrorContent.ToString();                txtName.Focus();            }        }
复制代码

运行结果:

如果要实现复杂的数据验证,INotifyDataErrorInfo也是一个不错的选择,有不足之处,请大家指出。

转载于:https://www.cnblogs.com/fcsh820/archive/2012/03/02/2377568.html

(转)Silverlight数据校验之INotifyDataErrorInfo相关推荐

  1. SilverLight学习笔记--实际应用(一)(4):手把手建立一个Silverlight应用程序之同步数据校验1...

    现在我们的程序有了添加和删除以及修改功能,下面我们看一看如何让程序具备数据校验功能.我们将用两种方式实现数据的校验,一种是在客户端进行同步校验.另一种是在服务器端进行异步校验.   本篇我们先实现如何 ...

  2. SilverlightMVVM模式中的数据校验

    silverlight的数据校验大体分成3种类型: 数据是非必填的但是需要满足相应数据格式的 数据是必填的且可能需要进行数据格式校验的 其他(如数据的联动校验) 以下的数据校验方式针对第二种: 在相应 ...

  3. c语言实现java接口_五分钟带你了解Java是如何从容而优雅地实现接口数据校验

    本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返 ...

  4. Maatkit工具使用lt;一gt;之mysql主从数据校验工具

    mysql主从数据校验工具       mysql在5.1之前,其replication都是采用的STATEMENT模式,对表的数据是否一致要求并不严格,所以对数据一致性要求比较严格的应用,定期检查数 ...

  5. Go 语言编程 — validator 数据校验工具

    目录 文章目录 目录 Validator Quick start 约束类型 特殊约束 格式约束 数据结构类型约束 范围约束 字符串约束 唯一性约束 跨字段约束 自定义约束 错误处理 中文错误信息 参考 ...

  6. SpringMVC_数据校验

    一:数据校验的分类 数据校验分为前台校验和后台校验,前台校验主要是利用JavaScript来完成的,后台校验主要利用Java代码来完成的,可以使用SpringMvc和Hibernate validat ...

  7. WPF使用IDataErrorInfo进行数据校验

    这篇博客将介绍如何使用IDataErrorInfo进行数据校验.下面直接看例子.一个Customer类,两个属性(FirstName, Age) class Customer {public stri ...

  8. C#之windows桌面软件第七课:(下集)串口工具实现数据校验、用灯反应设备状态

    C#之windows桌面软件第七课:(下集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...

  9. C#之windows桌面软件第六课:(上集)串口工具实现数据校验、用灯反应设备状态

    C#之windows桌面软件第六课:(上集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...

最新文章

  1. 来了个假阿里? | 每日趣闻
  2. 影响数千万APP的安卓APP“寄生兽”漏洞技术分析
  3. 【Python】ime series:时间序列
  4. SAP UI5 应用开发教程之三:开始接触第一个 SAP UI5 控件
  5. 暗影精灵4适合计算机专业,暗影精灵4pro怎么样_RTX系显卡带来的不仅是光追-太平洋电脑网...
  6. mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...
  7. P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
  8. 同时安装vs2010和VS2012后IEnumerableModelClientValidationRule编译错误
  9. JS获取鼠标的坐标和滚动条的位置
  10. 解决conda install速度慢
  11. Windows 系统彻底卸载 SQL Server 通用方法
  12. ACM公约数和公倍数
  13. android 百度离线下载速度慢,Android手机解决百度网盘下载速度限制
  14. git的使用——reset
  15. windows_server_2008_远程桌面(授权、普通用户登录多用户登录
  16. js中“\”转义字符的使用
  17. phpStudy激活码
  18. 连接阿里云生活物联网平台(飞燕平台)步骤记录
  19. CommVault v11新特性和战略解读
  20. es sql实现分页

热门文章

  1. 怎么用python处理excel文件-Python自动化如何处理excel文件数据
  2. python快速入门答案-Python 开发 14 天快速入门
  3. python使用符号#表示单行注释-Pyhton中单行和多行注释的使用方法及规范
  4. 从零开始学python电子书-从零开始学Python程序设计 PDF
  5. python解一元二次方程步骤-一元二次方程解法的实现(Python)
  6. pythonweb开发-一步步教你开始使用Python开发Web应用
  7. 少儿python编程培训-厦门在线儿童编程课
  8. python app教程-Python zipapp打包教程(超级详细)
  9. python教程廖雪峰云-Python教程
  10. python软件安装步骤-Linux中Python 环境软件包安装步骤