WPF控件输入值验证

1.创建数据验证规则

    /// <summary>
    /// 数据值验证
    /// </summary>
    public class ValidationExtensionRules
    {

        //校验数字的表达式


        /// <summary>
        /// 数字
        /// </summary>
        /// <param name="_val"></param>
        /// <returns></returns>
        public static ValidationResult MumberVerif(string _val)
        {
            string pattern = @"^[0-9]*$";
            if (!Regex.IsMatch(_val, pattern))
            {
                return new ValidationResult("输入值数字类型!");
            }
            return ValidationResult.Success;
        }
        /// <summary>
        /// 大于等于零整数
        /// </summary>
        /// <param name="_val"></param>
        /// <returns></returns>
        public static ValidationResult ZeroPlusIntVerif(int _val)
        {
            if (_val<0)
            {
                return new ValidationResult("输入值不能小于零!");
            }
            return ValidationResult.Success;
        }
        /// <summary>
        /// 零和非零开头的数字
        /// </summary>
        /// <param name="_val"></param>
        /// <returns></returns>
        public static ValidationResult StartNoZeroIntVerif(string _val)
        {
            string pattern = @"^(0|[1-9][0-9]*)$";
            if (!Regex.IsMatch(_val, pattern))
            {
                return new ValidationResult("输入值不能小于零!");
            }
            return ValidationResult.Success;
        }

        /// <summary>
        /// 非零开头的最多带两位小数的数字
        /// </summary>
        /// <param name="_val"></param>
        /// <returns></returns>
        public static ValidationResult StartNoZeroDoubleVerif(string _val)
        {
            string pattern = @"^([1-9][0-9]*)+(\.[0-9]{1,2})?$";
            if (!Regex.IsMatch(_val, pattern))
            {
                return new ValidationResult("输入值不能小于零!");
            }
            return ValidationResult.Success;
        }
    }

    /// <summary>
    /// 数据值验证方法名称
    /// </summary>
    public class ValidRulesName
    {
        /// <summary>
        /// 数字
        /// </summary>
        public const string MumberVerif = "MumberVerif";
        /// <summary>
        /// 大于等于零整数
        /// </summary>
        public const string ZeroPlusIntVerif = "ZeroPlusIntVerif";
        /// <summary>
        /// 零和非零开头的数字
        /// </summary>
        public const string StartNoZeroIntVerif = "StartNoZeroIntVerif";
        
        /// <summary>
        /// 非零开头的最多带两位小数的数字
        /// </summary>
        public const string StartNoZeroDoubleVerif = "StartNoZeroDoubleVerif";
    }

2.创建ValidationUtility错误提示

    public class ValidationUtility: IDataErrorInfo
    {
        public string Error
        {
            get { return _error; }
        }

        public string _error;

        //public string this[string columnName]
        //{
        //    get
        //    {
        //        Type tp = this.GetType();
        //        PropertyInfo pi = tp.GetProperty(columnName);
        //        var value = pi.GetValue(this, null);
        //        object[] Attributes = pi.GetCustomAttributes(false);
        //        if (Attributes != null && Attributes.Length > 0)
        //        {
        //            foreach (object attribute in Attributes)
        //            {
        //                if (attribute is ValidationAttribute)
        //                {
        //                    ValidationAttribute vAttribute = attribute as ValidationAttribute;
        //                    if (!vAttribute.IsValid(value))
        //                    {
        //                        _error = vAttribute.ErrorMessage;
        //                        return _error;
        //                    }
        //                }
        //            }
        //        }
        //    }
        //}

        public string this[string columnName]
        {
            get
            {
                var vc = new ValidationContext(this, null, null);
                vc.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;
            }
        }
    }

3.BaseViewModel继承ValidationUtility

public class BaseViewModel : Utility.ValidationUtility,INotifyPropertyChanged
    {
        #region UI更新接口
        public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName = null)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }

4.ViewModel中使用


        private double _Number;
        [CustomValidation(typeof(ValidationExtensionRules), ValidRulesName.MumberVerif)]
        /// <summary>
        /// 数字
        /// </summary>
        public double Number
        {
            get { return _Number; }
            set
            {
                _Number = value;
                OnPropertyChanged("Number");
            }
        }

5.控件上使用

<TextBox Width="60" Text="{Binding Number,Mode=TwoWay,UpdateSourceTrigger=LostFocus,ValidatesOnExceptions=True,ValidatesOnDataErrors=True}" />

设置TextBox 属性InputHint

<!-- 错误提示 -->
                        <Trigger Property="Validation.HasError" Value="True">
                            <Setter Property="InputHint" Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors)[0].ErrorContent}"/>
                            <Setter Property="IsOpen" TargetName="popupHint" Value="true"/>
                        </Trigger>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值