【问题标题】:How to show validatioin errors on different columns from IDataErrorInfo?如何在 IDataErrorInfo 的不同列上显示验证错误?
【发布时间】:2015-09-24 14:04:10
【问题描述】:

问题:我希望使用在UI上包含输入文本框的默认错误,但是在一个字段中输入需要突出显示其他多个有错误的文本框。

示例:如果所有文本框都是空的,则没有错误。如果只有一个文本框有一个字符串,那么其他两个文本框都应该突出显示。 (带有数据的文本框不是错误,但其他两个 - 如果为空 - 现在有错误)。如果字符串随后被删除并且所有文本框都为空,则不会出现错误并且不会突出显示任何内容。

我似乎找不到这个简单问题的答案。我有一个具有三个属性的业务对象 (MVVM),每个属性都绑定到 XAML 中的一个文本框,如下所示:

  <wc:AutoFilteredComboBox 
              .. 
              Text="{Binding ReferredBy.NewReferralName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
 ....
/>


  <TextBox  
                   Text="{Binding ReferredBy.Phone, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
         />

 <TextBox 
     ......            
        Text="{Binding ReferredBy.PriorAuthorizationNumber, ValidatesOnDataErrors=True}" 
         />

以及实现 IDataErrorInfo 的 ViewModel:

  public string Error
    {
        get { return null; }
    }

    // any returned non-empty string is an error.
    public string this[string columnName]
    {
        get
        {
            switch (columnName)
            {
                case "NewReferralName":

                    if (!String.IsNullOrWhiteSpace(PriorAuthorizationNumber) || !String.IsNullOrWhiteSpace(Phone))
                    {
                        if (String.IsNullOrWhiteSpace(NewReferralName))
                            return "NewReferralName is invalid";
                    }
                    break;
                case "Phone":
                    if (!String.IsNullOrWhiteSpace(NewReferralName) && String.IsNullOrWhiteSpace(Phone))
                    {
                            return "Phone is invalid";
                    }
                    break;
                case "PriorAuthorizationNumber":
                    if (!String.IsNullOrWhiteSpace(NewReferralName) && String.IsNullOrWhiteSpace(PriorAuthorizationNumber))
                    {
                        return "PriorAuthorizationNumber is invalid";
                    }
                    break;
            }
            // string.Empty is no error.
            return string.Empty;
        }
    }

那么,如果将数据输入到一个文本框,如何在另一个文本框上显示错误? IDataErrorInfo 可以用于此,还是有更好的方法?

TIA

【问题讨论】:

    标签: c# wpf validation xaml


    【解决方案1】:

    当然,您可以使用 IDataErrorInfo 来实现这一点。 这里的技巧是“告诉”视图在 INotifyPropertyChanged 的​​帮助下重新评估您的验证。当用户更改一个属性的值时,ViewModel 不仅要通知 View 属性发生了变化,其他相关的也一样。

    例如:

    public class ViewModel : INotifyPropertyChanged, IDataErrorInfo
    {
         // Do this for each involved property in your ViewModel
         private string _newReferralName;
         public string NewReferralName
         {
             get { return _newReferralName; }
             set
             {
                 _name = value;
                 RaisePropertyChanged("NewReferralName");
    
                 // The tricky part. Notify that the related properties 
                 // have to be refreshed (in the View) and, thus, reevaluated
                 RaisePropertyChanged("Phone");
                 RaisePorpertyChanged("PriorAuthorizationNumber");
             }
         }
         ...
    
         // INotifyPropertyChanged implementation
         public event PropertyChangedEventHandler PropertyChanged;
         void RaisePropertyChanged(string prop)
         {
             if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(prop));
         }
    
    }
    

    【讨论】:

    • 呃...谢谢。 (睡觉时间到了)。 :)
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2010-11-14
    相关资源
    最近更新 更多