输入无效数据类型时,不会调用PropertyChanged?

时间:2017-07-02 17:11:16

标签: c# wpf validation data-binding

假设有一条规则,用户不能为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>

我希望我能清楚地描述问题,希望得到帮助,谢谢!

0 个答案:

没有答案