在Validation.Errors绑定中使用转换器

时间:2012-10-04 12:39:39

标签: wpf validation

在我的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个警告)和一个红色边框。 [OK]
  • 键入'文字'以更正错误,更改焦点。
    价值转换器甚至没有被击中!当然,同样的红色边框。但ListView已更改并仅显示一个警告。

有人可以解释发生了什么吗?为什么ListView收到集合更改通知而Border不是?是因为ListViewItemsControlValidation.Errors是否包含在CollectionView中?

1 个答案:

答案 0 :(得分: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转换器(现在是实现IMultiValueConverter)。