(转)Silverlight数据校验之INotifyDataErrorInfo
原文地址: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相关推荐
- SilverLight学习笔记--实际应用(一)(4):手把手建立一个Silverlight应用程序之同步数据校验1...
现在我们的程序有了添加和删除以及修改功能,下面我们看一看如何让程序具备数据校验功能.我们将用两种方式实现数据的校验,一种是在客户端进行同步校验.另一种是在服务器端进行异步校验. 本篇我们先实现如何 ...
- SilverlightMVVM模式中的数据校验
silverlight的数据校验大体分成3种类型: 数据是非必填的但是需要满足相应数据格式的 数据是必填的且可能需要进行数据格式校验的 其他(如数据的联动校验) 以下的数据校验方式针对第二种: 在相应 ...
- c语言实现java接口_五分钟带你了解Java是如何从容而优雅地实现接口数据校验
本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返 ...
- Maatkit工具使用lt;一gt;之mysql主从数据校验工具
mysql主从数据校验工具 mysql在5.1之前,其replication都是采用的STATEMENT模式,对表的数据是否一致要求并不严格,所以对数据一致性要求比较严格的应用,定期检查数 ...
- Go 语言编程 — validator 数据校验工具
目录 文章目录 目录 Validator Quick start 约束类型 特殊约束 格式约束 数据结构类型约束 范围约束 字符串约束 唯一性约束 跨字段约束 自定义约束 错误处理 中文错误信息 参考 ...
- SpringMVC_数据校验
一:数据校验的分类 数据校验分为前台校验和后台校验,前台校验主要是利用JavaScript来完成的,后台校验主要利用Java代码来完成的,可以使用SpringMvc和Hibernate validat ...
- WPF使用IDataErrorInfo进行数据校验
这篇博客将介绍如何使用IDataErrorInfo进行数据校验.下面直接看例子.一个Customer类,两个属性(FirstName, Age) class Customer {public stri ...
- C#之windows桌面软件第七课:(下集)串口工具实现数据校验、用灯反应设备状态
C#之windows桌面软件第七课:(下集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...
- C#之windows桌面软件第六课:(上集)串口工具实现数据校验、用灯反应设备状态
C#之windows桌面软件第六课:(上集)串口工具实现数据校验.用灯反应设备状态 using System; using System.Collections.Generic; using Syst ...
最新文章
- 来了个假阿里? | 每日趣闻
- 影响数千万APP的安卓APP“寄生兽”漏洞技术分析
- 【Python】ime series:时间序列
- SAP UI5 应用开发教程之三:开始接触第一个 SAP UI5 控件
- 暗影精灵4适合计算机专业,暗影精灵4pro怎么样_RTX系显卡带来的不仅是光追-太平洋电脑网...
- mysql索引三个字段查询两个字段_mysql中关于关联索引的问题——对a,b,c三个字段建立联合索引,那么查询时使用其中的2个作为查询条件,是否还会走索引?...
- P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索
- 同时安装vs2010和VS2012后IEnumerableModelClientValidationRule编译错误
- JS获取鼠标的坐标和滚动条的位置
- 解决conda install速度慢
- Windows 系统彻底卸载 SQL Server 通用方法
- ACM公约数和公倍数
- android 百度离线下载速度慢,Android手机解决百度网盘下载速度限制
- git的使用——reset
- windows_server_2008_远程桌面(授权、普通用户登录多用户登录
- js中“\”转义字符的使用
- phpStudy激活码
- 连接阿里云生活物联网平台(飞燕平台)步骤记录
- CommVault v11新特性和战略解读
- es sql实现分页
热门文章
- 怎么用python处理excel文件-Python自动化如何处理excel文件数据
- python快速入门答案-Python 开发 14 天快速入门
- python使用符号#表示单行注释-Pyhton中单行和多行注释的使用方法及规范
- 从零开始学python电子书-从零开始学Python程序设计 PDF
- python解一元二次方程步骤-一元二次方程解法的实现(Python)
- pythonweb开发-一步步教你开始使用Python开发Web应用
- 少儿python编程培训-厦门在线儿童编程课
- python app教程-Python zipapp打包教程(超级详细)
- python教程廖雪峰云-Python教程
- python软件安装步骤-Linux中Python 环境软件包安装步骤