如何在用户将数据输入字段之前阻止验证?

时间:2014-05-09 12:05:56

标签: wpf validation mvvm

我有常规控件的WPF表单:combobox,TextEdit等。

我正在使用标准的WPF验证:

  1. ViewModel必需属性具有必需属性w / message
  2. ViewModel实现IDataErrorInfo
  3. 强制控制具有ValidatesOnDataErrors = True,绑定时NotifyOnValidationError = True
  4. 当使用新的ViewModel显示表单时,必须使用错误模板装饰强制控件。 对我而言,似乎是WPF验证的假设和设计工作方式。

    我团队中的其他人(恭敬地)争辩说,在用户输入任何数据之前显示用户验证错误是不可接受的做法。

    这对我有意义。因此,如果我只想在用户输入数据后显示验证错误,我需要以某种方式暂停验证,直到用户输入数据然后触发验证。 对我而言,似乎重新发明了一个轮子。

1 个答案:

答案 0 :(得分:1)

有一种真的简单的方法来“忽略”IDataErrorInfo接口的验证。现在不同的开发人员将以不同的方式实现他们的验证,但是在某个阶段和某个位置,我们都会有一些if ... else语句。此解决方案将要求您向数据类型类添加bool属性,或者最好是数据类型的基类(如果有的话):

public bool IsValidatable { get; set; } // Implement INotifyPropertyChanged here

当然,您需要通知INotifyPropertyChanged.PropertyChanged事件此属性的更改,所以请不要按照我上面的懒惰示例进行操作。现在,您可能已经猜到了解决方案的其余部分......只要您定义了验证条件,它就会涉及额外的if语句:

public override string this[string propertyName]
{
    get
    {
        string error = string.Empty;
        if (IsValidatable)
        { 
            if (propertyName == "Name" && Name.IsNullOrEmpty()) error = "You must enter the Name field.";
            else if (propertyName == "Name" && !Name.ValidateMaximumLength(127)) error = propertyName.GetMaximumLengthError(127);
            ...
            else if (propertyName == "Description" && !Description.ValidateMaximumLength(512)) error = propertyName.GetMaximumLengthError(512);
        }
        return error;
    }
}

最后,要使您的数据类型可验证,只需从您的视图模型执行此操作:

dataType.IsValidatable = true;

要停止验证,只需从您的视图模型执行此操作:

dataType.IsValidatable = false;

这很容易扩展......如果您为数据类型定义了自定义集合,则可以简单地遍历每个集合项并将IsValidatable属性设置为输入值:

collection.IsValidatable = true;