假设有一条规则,用户不能为Name
输入属性Age
和“1”的“X”,我知道这是一个奇怪的规则,但它有助于描述我的问题。
因此,在模型类的INotifyDataErrorInfo
索引器中,我添加了规则:
switch(propertyName)
{
bool hasError = false;
case nameof(Name):
if (Name == "X" && Age == 1)
{
AddError(nameof(Name), "BAD input");
hasError = true;
}
if (!hasError)
ClearErrors(nameof(Name));
break;
case nameof(Age):
if (Name == "X" && Age == 1)
{
AddError(nameof(Age), "BAD input");
hasError = true;
}
if (!hasError)
ClearErrors(nameof(Age));
break;
}
AddError
只是将错误添加到GetErrors
方法返回的错误集合中。
这是输入的XAML:
<Label Grid.Row="2">Name</Label>
<TextBox Grid.Column="1" Grid.Row="2" Name="txtName" Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}"/>
<Label Grid.Row="3">Age</Label>
<TextBox Grid.Column="1" Grid.Row="3" Name="txtAge" Text="{Binding Path=Age, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True, ValidatesOnDataErrors=True}"/>
当我为Name
输入“X”而为Age
输入“1”时,错误消息会在错误模板中显示为预期:
<ListBox Grid.Row="8" Grid.ColumnSpan="2" ItemsSource="{Binding ElementName=mGrid, Path=(Validation.Errors)}">
<ListBox.ItemTemplate>
<DataTemplate>
<ListBox ItemsSource="{Binding Path=ErrorContent}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
当我使用任何字母输入 1 后,使其与绑定的int
字段无效输入时,模板中的错误不会消失,尽管输入不是“ X“AND”1“。我在Age
属性中设置了一个断点,我发现它没有被击中,因此,我得出结论,使用绑定字段数据类型设置无效输入不会调用此字段设置器。但是如何从模板中清除错误消息(当调用setter时,Clear方法在propertyChanged fired =&gt;时调用的索引器内部!),以及如何显示输入无效输入的正确消息。 / p>
我希望我能清楚地描述问题,希望得到帮助,谢谢!