我有定期的控制WPF形式:组合框,文本编辑等。
我使用的标准WPF验证:
- 视图模型强制属性都必需属性瓦特/消息
- 视图模型实现IDataErrorInfo的
- 强制控制具有ValidatesOnDataErrors =真,NotifyOnValidationError在装订=真
当显示有新视图模型的形式强制性控制都装饰瓦特/错误范本。 对我来说,似乎是WPF验证如何假设和设计工作。
其他人对我的团队认为(恭敬地),这是不能接受的做法,以显示用户验证错误用户输入任何数据之前。
这对我来说很有意义。 所以,如果我要显示验证错误用户输入的数据后,才需要以某种方式暂停验证,直到用户输入数据,然后触发验证。 对我来说,这似乎是重塑车轮。
还有就是要“忽略”的有效性的一个非常简单的方法IDataErrorInfo
接口。 现在,不同的开发商将实现他们的验证方式不同,但在某些阶段,在一些位置,我们都将有一些if ... else
语句。 该解决方案将要求你添加一个bool
属性数据类型的类(ES),或最好是基类的数据类型,如果你有一个:
public bool IsValidatable { get; set; } // Implement INotifyPropertyChanged here
当然,你需要通知INotifyPropertyChanged.PropertyChanged
改变这个属性的事件,所以请不要按照上述我懒的例子。 现在,你可能已经猜到了该解决方案的其他...它只是涉及到一个额外的if
声明,无论你已经定义了验证conditons:
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;