1. 程式人生 > >WPF MVVM在ViewModel裡提交資料驗證

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 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,好吧。這肯定不是最好的辦法,希望有更好方法的大佬能分享出來。。。

原文地址:https://www.cnblogs.com/GetMoney/p/10245339.html