原文:WPF中使用Data Annotations验证Model

.NET Framework中System.ComponentModel.DataAnnotations提供了很多属性来验证对象的属性。可以在C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\{.NET Version}\路径下面找到System.ComponentModel.DataAnnotations.dll

public class User
{[Required][StringLength(20)]public string Name { get; set; }[Range(1,120)]public int Age { get; set; }
}

检查一个实例是否合法有效,使用下面的代码,具体可以参考: https://msdn.microsoft.com/en-us/library/dd411772%28v=vs.110%29.aspx

Validator.TryValidateObject(obj,new ValidationContext(obj),results,true);

static void Main(string[] args)
{ICollection<ValidationResult> results = null;User invalidUser = new User{Name = "My name is System.ComponentModel.DataAnnotations",Age = -1,};if(!Validate(invalidUser, out results)){Console.WriteLine(string.Join("\n", results.Select(o=>o.ErrorMessage)));}else{Console.WriteLine("I am a valid object.");}Console.ReadKey();
}static bool Validate<T>(T obj, out ICollection<ValidationResult> results)
{results = new List<ValidationResult>();return Validator.TryValidateObject(obj, new ValidationContext(obj), results, true);
}

代码中实例化了一个非法的User,代码执行结果如下:

这些ErrorMessage是.NET提供的,如果需要自定义错误信息可以在Attribute上增加ErrorMessage,代码如下:

public class User
{[Required][StringLength(20, ErrorMessage ="Out of range~")]public string Name { get; set; }[Range(1,120, ErrorMessage ="Not a valid age.")]public int Age { get; set; }
}

执行结果如下:

如果将User的属性修改为合法的值,结果如下:

User validUser = new User
{Name = "Hellen",Age = 18,
};

在WPF中,继承IDataErrorInfo接口,通过IDataErrorInfo来传递Data Annotation的ErrorMessage。

class PropertyValidateModel : IDataErrorInfo
{public string this[string columnName]{get{List<ValidationResult> validationResults = new List<ValidationResult>();bool result = Validator.TryValidateProperty(GetType().GetProperty(columnName).GetValue(this),new ValidationContext(this){MemberName = columnName},validationResults);if (result)return null;return validationResults.First().ErrorMessage;}}public string Error{get{return null;}}
}

这里只验证单个属性,下面是Model类,注意:Model需要继承INotifyPropertyChanged接口,直接看代码,

class User : PropertyValidateModel, INotifyPropertyChanged
{private string _name = string.Empty;private int _age = 0;[Required][StringLength(20)]public string Name{get{return _name;}set{if(_name != value){_name = value;RaisePropertyChanged("Name");}}}[Required][Range(1,120)]public int Age{get{return _age;}set{if(_age != value){_age = value;RaisePropertyChanged("Age");}}}public event PropertyChangedEventHandler PropertyChanged;protected virtual void RaisePropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}

下面看一下UI这一块的ErrorMessage绑定

<StackPanel><TextBlock Text="Name: "/><TextBox Text="{Binding User.Name,UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Margin="0,10"><Validation.ErrorTemplate><ControlTemplate><StackPanel><AdornedElementPlaceholder x:Name="textBox" /><TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/></StackPanel></ControlTemplate></Validation.ErrorTemplate></TextBox><TextBlock Text="Age" /><TextBox Text="{Binding User.Age, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" Margin="0,10"><Validation.ErrorTemplate><ControlTemplate><StackPanel><AdornedElementPlaceholder x:Name="textBox" /><TextBlock Text="{Binding [0].ErrorContent}" Foreground="Red"/></StackPanel></ControlTemplate></Validation.ErrorTemplate></TextBox>
</StackPanel>

运行结果如下:

补充一个内容:

如何自定义一个ValidationAttribute。只需要继承ValidationAttribute,并重写IsValid方法即可。例如:

    public class DivisibleBy7Attribute : ValidationAttribute{public DivisibleBy7Attribute():base("{0} value is not divisible by 7"){}protected override ValidationResult IsValid(object value, ValidationContext validationContext){decimal val = (decimal)value;bool vaild = val % 7 == 0;if (vaild)return null;return new ValidationResult(base.FormatErrorMessage(validationContext.MemberName));}}

感谢您的阅读!代码点击这里下载。

WPF中使用Data Annotations验证Model相关推荐

  1. WPF中的Data Binding调试指南

    点击蓝字"大白技术控"关注我哟 加个"星标★",每日良时,好文必达! WPF中的Data Binding如何Debug? 大家平时做WPF开发,相信用Visua ...

  2. WebApi数据验证——编写自定义数据注解(Data Annotations)

    2019独角兽企业重金招聘Python工程师标准>>> 配合ModelState使用,关于使用方法,参考微软文档 https://docs.microsoft.com/en-us/a ...

  3. 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证

    在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...

  4. asp.net MVC 中使用dataannotation验证Model

    看到的一个好文章,讲如何验证Model webconfig中添加 <appSettings>         <add key="ClientValidationEnabl ...

  5. 转:WPF中图形表示语法详解(Path之Data属性语法)

    转自:http://blog.csdn.net/johnsuna/article/details/1885597 大可山 [MSN:a3news(AT)hotmail.com]  http://www ...

  6. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射

    为什么80%的码农都做不了架构师?>>>    EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...

  7. WPF中ControlTemplate和DataTemplate的区别

    原文:WPF中ControlTemplate和DataTemplate的区别 下面代码很好的解释了它们之间的区别: <Window x:Class="WPFTestMe.Window1 ...

  8. 在WPF中使用WinForm控件方法

    在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1.      首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...

  9. WPF中的依赖项属性

    随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性是WPF中不同的地方,先了解一下它 ...

最新文章

  1. 未来,中国空间站将成为怎样的“太空科研站”?
  2. IDEA中如何彻底删除项目
  3. hdoj 2544 最短路
  4. java基础(一):谈谈java内存管理与垃圾回收机制
  5. 关于ActiveMQ的一点总结
  6. could not find curses mysql_​-- Configuring incomplete-- Could NOT find Curses
  7. pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
  8. TypeScript Symbol
  9. java工作面试必备知识 Java常用类库与技巧
  10. 供应商禁止供货后,这个城市行动了:社区团购不得低价倾销、排挤对手
  11. oracle 表字段顺序_如何更改Oracle数据库表中字段顺序
  12. 十七、创建一个 WEB 服务器(一)
  13. .net core部署到Ubuntu碰到的问题
  14. 101个著名的管理学及心理学效应(2)
  15. 阿里架构师墙裂推荐Java岗实战文档:Spring全家桶+Docker+Redis
  16. 判断ipad横竖屏的两个方法
  17. 如何使用Veeam One默认安装出来的Sql Server数据库
  18. 图像灰度共生矩阵cooc_feature_image.hdev
  19. 2020版本kali安装
  20. worldwind 三维模型加载优化总结

热门文章

  1. 超融合架构和服务器虚拟化是什么关系?超融合厂商提供什么样的服务器虚拟化?...
  2. 死锁检测的常用3种方法
  3. Excel下让图表同时显示柱状图和线形图
  4. 飞语云通信SDK,助力社交、医疗、金融等
  5. linux su密码重置,Linux重置root用户密码
  6. sql存储过程中分隔字符串
  7. open falcon mysql参数_Open-falcon原理介绍
  8. 企业微信私域流量运营神器
  9. go实现分布式爬虫1
  10. 『创新.领导力.工程师』丨陆奇怎么说?