为了验证,我总是实现IDataErrorInfo
orINotifyDataErrorInfo
接口,第二个更新并且(在我看来)更好。在模型或数据类型类中实现这些接口时,您可以在定义属性的位置提供验证。这对我来说完全有意义,因为它还允许使用多个属性值执行复杂的验证。
这是一个简短的示例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}" />
更新>>>
当我想根据属性中是否存在错误消息来更改某些内容时Error
,我将一个bool
属性添加到模型基类中:
public bool HasError
{
return Error != null && Error != string.Empty;
}
然后我只需将此bool
属性与BoolToWhateverConverter
... 在您的情况下,您想创建一个BooleanToBrushConverter
. 如果您需要这方面的帮助,请提出另一个问题,我会注意的。
更新 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;
}
最好在模型类中包含这些属性,这样您就不必在模型类出现的每个视图模型中复制代码。