在我的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中输入一些“无效”文本时会发生什么。
有人可以解释发生了什么吗?为什么ListView收到集合更改通知而Border不是?是因为ListView
是ItemsControl
而Validation.Errors
是否包含在CollectionView
中?
答案 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
)。