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相关推荐
- WPF中的Data Binding调试指南
点击蓝字"大白技术控"关注我哟 加个"星标★",每日良时,好文必达! WPF中的Data Binding如何Debug? 大家平时做WPF开发,相信用Visua ...
- WebApi数据验证——编写自定义数据注解(Data Annotations)
2019独角兽企业重金招聘Python工程师标准>>> 配合ModelState使用,关于使用方法,参考微软文档 https://docs.microsoft.com/en-us/a ...
- 在Asp.Net MVC中实现RequiredIf标签对Model中的属性进行验证
在Asp.Net MVC中可以用继承ValidationAttribute的方式,自定制实现RequiredIf标签对Model中的属性进行验证 具体场景为:某一属性是否允许为null的验证,要根据另 ...
- asp.net MVC 中使用dataannotation验证Model
看到的一个好文章,讲如何验证Model webconfig中添加 <appSettings> <add key="ClientValidationEnabl ...
- 转:WPF中图形表示语法详解(Path之Data属性语法)
转自:http://blog.csdn.net/johnsuna/article/details/1885597 大可山 [MSN:a3news(AT)hotmail.com] http://www ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
为什么80%的码农都做不了架构师?>>> EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...
- WPF中ControlTemplate和DataTemplate的区别
原文:WPF中ControlTemplate和DataTemplate的区别 下面代码很好的解释了它们之间的区别: <Window x:Class="WPFTestMe.Window1 ...
- 在WPF中使用WinForm控件方法
在WPF中使用WinForm控件方法 原文:在WPF中使用WinForm控件方法 1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,Syste ...
- WPF中的依赖项属性
随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性是WPF中不同的地方,先了解一下它 ...
最新文章
- 未来,中国空间站将成为怎样的“太空科研站”?
- IDEA中如何彻底删除项目
- hdoj 2544 最短路
- java基础(一):谈谈java内存管理与垃圾回收机制
- 关于ActiveMQ的一点总结
- could not find curses mysql_​-- Configuring incomplete-- Could NOT find Curses
- pyecharts对于经纬度_一文带你掌握Pyecharts地理数据可视化的方法
- TypeScript Symbol
- java工作面试必备知识 Java常用类库与技巧
- 供应商禁止供货后,这个城市行动了:社区团购不得低价倾销、排挤对手
- oracle 表字段顺序_如何更改Oracle数据库表中字段顺序
- 十七、创建一个 WEB 服务器(一)
- .net core部署到Ubuntu碰到的问题
- 101个著名的管理学及心理学效应(2)
- 阿里架构师墙裂推荐Java岗实战文档:Spring全家桶+Docker+Redis
- 判断ipad横竖屏的两个方法
- 如何使用Veeam One默认安装出来的Sql Server数据库
- 图像灰度共生矩阵cooc_feature_image.hdev
- 2020版本kali安装
- worldwind 三维模型加载优化总结