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 > 0)
            {
                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

原码下载

时间: 2024-11-09 17:28:28

WPF/Silverlight 页面绑定Model验证机制升级版的相关文章

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

原文:ASP.NET MVC基于标注特性的Model验证:将ValidationAttribute应用到参数上 ASP.NET MVC默认采用基于标准特性的Model验证机制,但是只有应用在Model类型及其属性上的ValidationAttribute才有效.如果我们能够将ValidationAttribute特性直接应用到参数上,我们不但可以实现简单类型(比如int.double等)数据的Model验证,还能够实现“一个Model类型,多种验证规则”,本篇文章将为你提供相关的解决方案(源代码

ASP.NET MVC Model验证(一)

ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后面的篇幅中讲解MVC框架中Model验证的机制,以及一些Model验证的方式讲解,本章只是一个简单的示例篇幅,对于有基础的朋友可以直接跳过了(不能耽误大家时间). Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBinder进行

ASP.NETMVC Model验证(四)

ASP.NETMVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型.

ASP.NET MVC Model验证(三)

ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的Model验证是在哪个具体的方法中来执行的,本篇的主题就是模拟一下默认的实现,自定义个Model绑定器继承自DefaultModelBinder类型,并且重写某些个重要的方法. Model验证 Model验证简单运用示例 ModelValidator使用生成过程 自定义实现DefaultModelBi

ASP.NET MVC Model验证(四)

ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而ModelValidator类型则是Model验证执行类型,在下面的示例中会使用Model验证提供程序结合Model验证执行类型来执行Model验证,就是使用上个篇幅中所讲的实现个Model绑定器继承自DefaultModelBinder类型,在自定义Model绑定器中使用ModelValidator类型

通过扩展改善ASP.NET MVC的验证机制[实现篇]

原文:通过扩展改善ASP.NET MVC的验证机制[实现篇] 在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最终是如何实现的. 目录: 一.为验证创建一个上下文:ValidatorContext 二.通过自定义ActionInvoker在进行操作执行之前初始化上下文 三.为Validator创建基类:ValidatorBaseAttribute 四.通过自定义ModelValidat

ASP.NET MVC Model验证(五)

ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它方式来进行Model验证,也就是本篇的主题,使用框架提供给我们的一系列的特性类型来进行Model验证,当然也是可以自定义的,在下面的演示示例中,我会使用我们自己自定义的特性类型(继承自ValidationAttribute类型)到自定义Model绑定器中来模拟一下实现. Model验证 Model验

django captcha和邮箱验证机制

验证码插件--django captcha和邮箱验证机制 对于web开发在用户注册登录的环节的验证码是在开发中必不可少的一个环节,这里介绍一下我在开发中经常使用到的一个带三方的验证码插件-- captcha 一.安装 在GitHub上可以直接下载: 也可以使用pip进行安装: 二.导入 1.settings.py文件 这里需要在INSTALLED_APPS中将其注册进去: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.aut

【我们一起写框架】MVVM的WPF框架之绑定(二)

MVVM的特点之一是实现数据同步,即,前台页面修改了数据,后台的数据会同步更新. 上一篇我们已经一起编写了框架的基础结构,并且实现了ViewModel反向控制Xaml窗体. 那么现在就要开始实现数据同步了. DataContext—数据上下文 在实现数据同步前,我们要了解一个知识点——DataContext. WPF中每个UI都有一个Content和一个DataContext,那么Content和DataContext是什么呢? Content:Content是指页面内容,即我们编写的代码,或者