zoukankan      html  css  js  c++  java
  • 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 

     原码下载

  • 相关阅读:
    网页加载进度条
    【转载】通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    前端知识复习:Html DIV 图文混排(文字放在图片下边)
    NOPI导出Excel
    C# 发送邮件
    DataSetToList 和 DataTableTolist 转换
    一个修改版的PHP ajax Tree树形菜单
    你的站为什么百度无动于衷——10年老站长的SEO肺腑之言 .
    关于php使用phpqrcode生成二维码的完整源码下载
    php结合phpqrcode生成带图片LOGO的二维码
  • 原文地址:https://www.cnblogs.com/lisweden/p/4745816.html
Copyright © 2011-2022 走看看