1

在我的 WPF 应用程序 (.Net 4.5) 中,我想向 UI 提供有关验证结果的扩展视觉反馈。数据层的验证引擎通过 INotifyDataErrorInfo 接口返回警告和错误。

我有以下 XAML 来显示红色或橙色边框,具体取决于错误类型和错误消息列表。这errorToColor是值转换器的资源键,如果集合中至少有一个错误,则返回红色刷子,如果Validation.Errors只有警告,则返回橙色刷子。

        <TextBox Name="MappingName" Text="{Binding Path=Mapping.Name, NotifyOnValidationError=True}" >
            <Validation.ErrorTemplate>
                <ControlTemplate>
                    <DockPanel>
                        <Border BorderBrush="{Binding Converter={StaticResource errorsToColor}}" BorderThickness="1">
                            <AdornedElementPlaceholder />
                        </Border>
                        <ListView DisplayMemberPath="ErrorContent" ItemsSource="{Binding}" />
                    </DockPanel>
                </ControlTemplate>
            </Validation.ErrorTemplate>
        </TextBox>

现在让我们看看当我在 TextBox 中键入一些“无效”文本时会发生什么。

  • 键入“Text1”并更改焦点。
    调试器进入转换器和两个验证器,导致 ListView 中有两个项目(1 个错误和 1 个警告)和一个红色边框。[好的]
  • 键入“文本”以更正错误,更改焦点。
    价值转换器甚至没有被击中!当然,同样的红色边框。但是 ListView 已经改变并且只显示一个警告。

有人可以解释发生了什么吗?为什么 ListView 收到集合更改通知而 Border 没有?是因为ListViewis anItemsControl并且 theValidation.Errors被包裹到了 中CollectionView吗?

4

1 回答 1

1

对于那些有兴趣的人。errorsToColor转换器没有被触发,因为在添加或删除错误时Validation.Errors集合没有引发PropertyChanged事件(需要触发器绑定转换器)。

为了引发PropertyChanged事件,我们需要绑定到每个添加错误时更改的属性,例如Count. 我仍然需要转换器中的 Errors 集合本身,所以我在这里使用了多重绑定。

            <Border BorderThickness="1">
                <Border.BorderBrush>
                    <MultiBinding Converter="{StaticResource errorsToColor}">
                        <Binding Path="." />
                        <Binding Path=".Count" />
                    </MultiBinding>
                </Border.BorderBrush>
                <AdornedElementPlaceholder Name="adornedElement" />
            </Border>

现在每次添加/删除新错误时都会执行errorsToColor转换器(现在是 implements )。IMultiValueConverter

于 2012-10-08T09:19:35.163 回答