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}"
如果你喜欢此文,请推荐一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗