【问题标题】:What is the best way to handle validation in WPF?在 WPF 中处理验证的最佳方法是什么?
【发布时间】:2013-06-12 13:59:56
【问题描述】:

我想实现在winforms中模拟Errorprovider的验证机制。 我尝试使用 IDataErrorInfo 但问题是它试图对表单加载执行验证。我的要求是我需要在单击页面中的按钮时执行验证。 在 WPF 中执行验证还有其他更好的方法吗?

【问题讨论】:

    标签: .net wpf validation


    【解决方案1】:

    听起来您现在已经弄清楚了验证,这很容易 - 防止它在需要之前进行验证。在实现 IErrorInfo 的类上放置一个 bool 属性:

    public bool IsReadyToValidate {get;set;}
    

    在每个属性中

    public object SomeProperty
    {
      get {return _someProperty;}
      set
          {
             if(_someProperty == value) return;
             _property = value;
             if(IsReadyToValidate) 
                   //do validation
    

    或者如果你使用基于属性的验证:

    [CustomMethodValidator("ValidateSomeProperty")]
        public string SomeProperty
        {
            if(_someProperty == value) return;
            set
            {
                 if(_property == value)
                                    return;
                                _property = value;
                RaisePropertyChanged(() => SomeProperty);
            }
        }
    
      private bool ValidateSomeProperty()
      {
           bool isValid = true;
           if(IsReadyToValidate)
              //do validation
    
            return is valid;
    

    单击按钮时,将 IsReadyToValidate 设置为 true 并重新验证。同样,这一切都取决于您的实现。 放个这样的方法吧?

    public void Validate()
        {
            foreach (var prop in PropertiesWithValidators[GetType()])
                ValidateProperty(prop.Name);
    
            HasErrors = _errorDictionary.Count > 0;
            RaisePropertyChanged(() => Error);
        }
    

    或者你可以做一些粗暴的方式,比如在你翻转标志来验证后重新填充属性

     public void Validate()
     {
         IsReadyToValidate = true;
         //now it will validate:
         SomeProperty = SomeProperty;
    

    【讨论】:

    • 请注意,您有一个非常开放的问题,有很多方法可以做到这一点,所以这些只是一些帮助您前进的想法..
    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2015-06-24
    • 2010-09-06
    • 2018-04-26
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多