为了验证,我总是实现IDataErrorInfo
或INotifyDataErrorInfo
接口,第二个更新和(在我看来)更好。在模型或数据类型类中实现这些接口时,您可以在定义属性的位置提供验证权限。这对我来说很有意义,因为它还允许使用多个属性值执行复杂的验证。
下面是IDataErrorInfo
的简短示例...首先实现Item
索引方法:
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = "Enter Name";
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
的IDataErrorInfo
接口暴露了一个名为Error
属性此索引集时,模型类的任何有关财产被改变。我们可以Bind
此属性中显示错误消息的UI,但只有一个在使用此接口时无需定制:
<TextBlock Text="{Binding Error}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
UPDATE >>>
当我想基于改变的东西是否存在在Error
属性的错误消息,我添加bool
属性到模型中的基类:
public bool HasError
{
return Error != null && Error != string.Empty;
}
然后,我只是使用此bool
属性与BoolToWhateverConverter
...在你的情况下,你想创建一个。如果您需要帮助,请提出另一个问题,我会留意。
更新2 >>>
@Koen,你是正确的,因为HasError
属性反映是否有模型对象中的任何验证错误。然而,有什么可添加另一个属性到一个特定的数据类型类阻止你:
string nameError = "Enter Name";
...
public override string this[string propertyName]
{
get
{
string error = string.Empty;
if (propertyName == "Name" && Name == string.Empty) error = nameError;
else if (propertyName == "Age" && Age < 18) error = "You're too young";
return error;
}
}
public bool HasNameError
{
return Error == nameError;
}
这当然是最好有在模型类,这些属性,所以您不必在每个视图复制代码模型类出现英寸
当设备属性无效时,需要更改相应文本框/标签的背景。这可能使用这些接口吗?乍一看,我不知道如何。 – Koen
我已经有BoolToBrushConverter的工作,但我想知道如果我可以 - 使用IDataErrorInfo - 更改1文本框的颜色,无论其他证书有错误。此时,我为每个属性都有一个“IsValidPropXxxx”。看看你的更新,它是验证完整的对象。我是否合照? – Koen
@Koen:请看链接,这里将会有关于ErrorTemplate的解释http://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate.aspx – Ravuthasamy