关于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验证机制升级版的更多相关文章

  1. ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上

    原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model ...

  2. MVC Model验证疑难杂症

    Q1:有验证但是还是能进入控制器(Controller) 排查之后发现js报错:VM109:1 Uncaught SyntaxError: Unexpected token u in JSON at ...

  3. 理解和使用WPF 验证机制

    博客 学院 下载 更多 写博客 发布Chat 登录注册 理解和使用WPF 验证机制 原创 2013年06月20日 11:15:37 7404 首先建立一个demo用以学习和实验WPF Data Val ...

  4. mvc的model验证,ajaxhelper,验证机制语法

    ajaxhelper: onsuccess是调用成功后显示方法,还有一个方法是调用前显示 model验证: 控件前端验证: 需要引入的JS 其中第二个是ajaxhelper的必须验证 后台的两个同名不 ...

  5. ASP.NET MVC Model验证(一)

    ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...

  6. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  7. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  8. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  9. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

随机推荐

  1. USB 3.0规范中译本 第1章 引言

    本文为CoryXie原创译文,转载及有任何问题请联系cory.xie#gmail.com. 1.1 动机(Motivation) Universal Serial Bus (USB) 的原始动机来自于 ...

  2. toLocaleDateString()

    在处理时间问题的时候,遇到了一个bug,关于toLocaleDateString()在不同浏览器下的解析结果. 代码如下 浏览器解析结果如下 可以看到谷歌,火狐等浏览器的输出结果是这种格式的 *201 ...

  3. Xmem

    http://blog.csdn.net/jthink_/article/details/43302615

  4. Java中的equals比较,小坑一个

    最近工作中,经常需要比较2个对象的值.有个问题经常遇到,就是下面的2种情况. public static void main(String[] args) { Integer a =11; Objec ...

  5. [NPM] Add comments to your npm scripts

    The need for comments in your package.json file becomes desirable the more and more npm scripts you ...

  6. hdu 4865 dp

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  7. Android Xfermode 真实 实现全面、圆角图片

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/42094215.本文出自:[张鸿洋的博客] 1.概述 事实上这篇本来准备Andro ...

  8. Windows安装Jekyll

    Run Jekyll on Windows 夹 Jekyll介绍 安装Ruby 安装DevKit 安装Jekyll 安装Python 安装pip 执行Jekyll Introduction Jekyl ...

  9. 【a803】营救

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 铁达尼号遇险了!它发出了求救信号.距离最近的哥伦比亚号收到了讯息,时间就是生命,必须尽快赶到那里.通过侦测, ...

  10. FPGA综合优化

    1 速度和面积 在全面优化水平将达到速度和面积RTL要利用逻辑拓扑的优势. 供FPGA由于在后端而言缺乏知识,门级优化.普通情况下更高的速度要求更高的并行性以及更大的面积,可是在某些特殊情况下并非这样 ...