WPF MVVM在ViewModel里提交数据验证
第一次自己写笔记,以后也会经常记录自己学习到的,嗯!
百度了很久实在没找到能用的,好吧咋自己来。
验证还是使用的DataAnnotations+IDataErrorInfo,贴下错误信息的类
public class DataErrorBase : IDataErrorInfo { public string Error { get { return ""; } } public string this[string columnName] { get { var vc = new ValidationContext(this, null, null) { MemberName = columnName }; var res = new List<ValidationResult>(); var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res); if (res.Count > 0) { return string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray()); } return string.Empty; } } }
下面是比较常用的非空验证,我把所有的验证都写在一个类文件里方便管理,接着看代码
public class EmptyExists : ValidationAttribute { public override bool IsValid(object value) { if (value == null) { return false; } if (value is string s) { if (s.Trim().Length <= 0) { return false; } } return true; } public override string FormatErrorMessage(string name) { return "值不允许为空"; } } /// <summary> /// 手机号验证 /// </summary> public class PhoneCalidation : ValidationAttribute { public override bool IsValid(object value) { var str = value as string; if (string.IsNullOrEmpty(str)) { return true; } if (str.Length != 11) { return false; } return true; } public override string FormatErrorMessage(string name) { return "请输入正确的手机号"; } }
这里面的手机号验证说一下,因为现在移动联通一直在加第二位的数字,比如13,19,18,17。所以我此处就没用做严格的校验。下面就是我处理的重头戏。接着看代码
public static bool IsValidation(this object obj, List<ValidationResult> valist) { var Pname = obj.GetType().GetProperties().ToList(); var vc = new ValidationContext(obj, null, null); foreach (var a in Pname) { vc.MemberName = a.Name; if (!Validator.TryValidateProperty(a.GetValue(obj, null), vc, valist)) { return false; } }; return true; }
嗯,其实就是反射遍历所有的公开属性依次验证,一旦一个没通过直接返回。为了代码连贯,也贴下调用的代码
public ICommand AddPatientCheck => //向DBUserPatientCheck表中添加数据 new DelegateCommand(obj => { try { var re = new List<ValidationResult>(); if (!this.IsValidation(re)) { MegBox.Show(re[0].ErrorMessage, "\ue602", 1000, new SolidColorBrush(Colors.Red)); return; } });
红色的部分就是调用刚刚的扩展方法,MegBox是自己封装的一个弹出框。
第一次接触WPF,好吧。这肯定不是最好的办法,希望有更好方法的大佬能分享出来。。。