在我的 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 没有?是因为ListView
is anItemsControl
并且 theValidation.Errors
被包裹到了 中CollectionView
吗?