WPF MVVM在ViewModel裡提交資料驗證
阿新 • • 發佈:2019-01-09
第一次自己寫筆記,以後也會經常記錄自己學習到的,嗯!
百度了很久實在沒找到能用的,好吧咋自己來。
驗證還是使用的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 str) { if (str.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 item in Pname) { vc.MemberName = item.Name; if (!Validator.TryValidateProperty(item.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,好吧。這肯定不是最好的辦法,希望有更好方法的大佬能分享出來。。。