【问题标题】:Using converter in Validation.Errors binding在 Validation.Errors 绑定中使用转换器
【发布时间】:2012-10-08 17:19:35
【问题描述】:

在我的 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 没有?是因为ListViewItemsControlValidation.Errors 被包裹在CollectionView 中吗?

【问题讨论】:

标签: wpf validation


【解决方案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)。

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2012-04-11
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2011-07-26
    • 2011-03-07
    相关资源
    最近更新 更多