我有常规控件的WPF表单:combobox,TextEdit等。
我正在使用标准的WPF验证:
当使用新的ViewModel显示表单时,必须使用错误模板装饰强制控件。 对我而言,似乎是WPF验证的假设和设计工作方式。
我团队中的其他人(恭敬地)争辩说,在用户输入任何数据之前显示用户验证错误是不可接受的做法。
这对我有意义。因此,如果我只想在用户输入数据后显示验证错误,我需要以某种方式暂停验证,直到用户输入数据然后触发验证。 对我而言,似乎重新发明了一个轮子。
答案 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;