WPF/Silverlight 页面绑定Model验证机制升级版
关于WPF/Silverlight的数据验证,想必大家都不陌生了。
各大牛的博客里都不泛对这方面讨论的文章。
个人比较赞赏 JV9的“Silverlight实例教程”里的Validation数据验证。
本文是在大牛基础上做了个升级,其验证更加简单和方便。
1、创建验证的基类
public class ValidationBase:IDataErrorInfo,INotifyPropertyChanged
{
protected string errMsg;
private bool hasValidate = false; public string Error
{
get
{
if (!hasValidate)
{
this.Validate();
}
return errMsg;
}
} public string this[string columnName]
{
get
{
this.hasValidate = true;
List<ValidationResult> resultList = new List<ValidationResult>();
ValidationContext context = new ValidationContext(this, null, null) { MemberName = columnName };
if (Validator.TryValidateProperty(this.GetPropertyValue(columnName), context, resultList))
{
return null;
}
this.errMsg = null;
foreach (var item in resultList)
{
this.errMsg += item.ErrorMessage + Environment.NewLine;
}
return this.errMsg;
}
} private object GetPropertyValue(string propName)
{
PropertyInfo property = base.GetType().GetProperty(propName, BindingFlags.GetProperty | BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
if (property == null)
{
return null;
}
if (property.GetIndexParameters().Length > )
{
return null;
}
return property.GetValue(this, null);
} public virtual bool Validate()
{
this.hasValidate = true;
List<ValidationResult> resultList = new List<ValidationResult>();
bool flag = Validator.TryValidateObject(this, new ValidationContext(this, null, null), resultList, true);
this.errMsg = null;
foreach (var item in resultList)
{
this.errMsg += item.ErrorMessage + Environment.NewLine;
}
return flag;
} public event PropertyChangedEventHandler PropertyChanged;
public void OnPeropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
继承IDataErrorInfo,提供界面绑定时验证信息的提示,INotifyPropertyChanged做一个扩展,方便实现属性的变更通知机制。
2、所有Model实体继承ValidationBase,例如:
public class Person : ValidationBase
{
[Required(ErrorMessage="姓名不能为空。")]
public string Name { get; set; } [Required(ErrorMessage="年龄不能为空。")]
[RegularExpression(@"^\d.$",ErrorMessage="年龄必须为整数。")]
public int? Age { get; set; }
}
3、页面绑定
Text="{Binding Name, Mode=TwoWay, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}"
如果你喜欢此文,请推荐一下。
最后,转载请注明出处:http://www.cnblogs.com/lisweden/p/4745816.html
WPF/Silverlight 页面绑定Model验证机制升级版的更多相关文章
- ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上
原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...
- MVC Model验证疑难杂症
Q1:有验证但是还是能进入控制器(Controller) 排查之后发现js报错:VM109:1 Uncaught SyntaxError: Unexpected token u in JSON at ...
- 理解和使用WPF 验证机制
博客 学院 下载 更多 写博客 发布Chat 登录注册 理解和使用WPF 验证机制 原创 2013年06月20日 11:15:37 7404 首先建立一个demo用以学习和实验WPF Data Val ...
- mvc的model验证,ajaxhelper,验证机制语法
ajaxhelper: onsuccess是调用成功后显示方法,还有一个方法是调用前显示 model验证: 控件前端验证: 需要引入的JS 其中第二个是ajaxhelper的必须验证 后台的两个同名不 ...
- ASP.NET MVC Model验证(一)
ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
- ASP.NET MVC Model验证(三)
ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
随机推荐
- 开源 免费 java CMS - FreeCMS1.9 会员管理
项目地址:http://www.freeteam.cn/ 会员管理 1. 会员管理 从左側管理菜单点击会员管理进入. 2. 加入会员 在会员列表下方点击"加入"button. 填写 ...
- Java中a=a+b 与 a+=b差别
一般觉得a=a+b的运行效率是低于a+=b的,由于它多进行了一步中间变量的操作,并且会多占用一个变量的空间.而Java编译器默认对其进行了优化,优化之后两条语句都当做 a+=b来运行了,所以实际上是没 ...
- poj 2689 Prime Distance(大区间筛素数)
http://poj.org/problem?id=2689 题意:给出一个大区间[L,U],分别求出该区间内连续的相差最小和相差最大的素数对. 由于L<U<=2147483647,直接筛 ...
- 一步步学习Linux多任务编程
系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...
- 百度echarts可以做什么
百度echarts可以做什么 一.总结 一句话总结:可视化做的很好,各种图都有.而且支持动态数据. 二.百度eCharts体验 前言 从昨天开始给项目里添加一些图表对比功能,上一个项目里使用的是Hig ...
- 【u225】最优分解方案
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题: 留下来的人太多 ...
- iOS项目中所有icon的尺寸以及命名
一般icon以下几个: Icon.png – 57×57 iPhone (ios5/6) Icon@2x.png – 114×114 iPhone Retina (ios5/6) Icon-72.pn ...
- Erlang游戏开发-协议
Erlang游戏开发-协议 选择什么协议? 协议包含通讯协议和数据格式. 通讯协议 通讯协议目前常用的是:HTTP 和TCP .其有各自的特点根据游戏的特点而进行选择. HTTP HTTP比较成熟,使 ...
- Java中的集合Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap(五)
Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...
- Windows下curl使用
一.简介 在上一篇中我们涉及到了一个在Ubuntu下使用的curl命令,而且使用这个命令来模拟server的功能来向谷歌的C2DMserver发送数据. 以下简单的来说下在Windows下相同的使用c ...