带有列表框的窗口没有在列表框上显示错误
本文关键字:列表 显示 错误 窗口 | 更新日期: 2023-09-27 17:50:14
我的WPF应用程序中有一个包含ListBox
的对话框。ListBox
使用以下DataTemplate
显示其内容:
<DataTemplate x:Key="AlarmClassTemplate">
<CheckBox Content="{Binding Path=Value}"
IsChecked="{Binding IsChecked}" />
</DataTemplate>
我还配置了以下模板和样式,以便在ListBox's
内容中出现错误时显示:
<ControlTemplate x:Key="InputErrorTemplateA">
<DockPanel LastChildFill="True">
<Image DockPanel.Dock="Right"
Height="30"
Margin="5"
Source="{StaticResource ErrorImage}"
ToolTip="Contains invalid data"
VerticalAlignment="Center"
Width="30" />
<Border BorderBrush="Red"
BorderThickness="5"
Margin="5">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<Style TargetType="{x:Type ListBox}">
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource InputErrorTemplateA}" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip">
<Setter.Value>
<Binding Path="(Validation.Errors).CurrentItem.ErrorContent" RelativeSource="{x:Static RelativeSource.Self}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
下面是ListBox
本身的XAML:
<ListBox FontSize="20"
FontWeight="Bold"
Grid.Column="1"
Grid.ColumnSpan="2"
Grid.Row="1"
Height="158"
ItemsSource="{Binding Path=IDs, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
ItemTemplate="{StaticResource AlarmClassTemplate}"
Margin="5,0,110,0"
Name="AlarmClassListBox"
ToolTip="{x:Static res:Car.EditDataRetention_AlarmClasses_ToolTip}"
Visibility="{Binding Converter={StaticResource BoolToVisibility}, Path=DataTypeIsAlarms}" />
ListBox
中数据的验证逻辑是至少有一项必须被选中。如果它们都不是,ListBox
应该显示一个错误,对话框上的OK
按钮应该被禁用。
好消息是,对话框上的OK
按钮确实在ListBox
中没有检查时被禁用。坏消息是Style
似乎没有工作,因为ListBox
周围没有显示红色边框,错误图像(一个红色圆圈,里面有一个白色感叹号)没有显示。
我在同一对话框的其他控件上使用相同的确切ControlTempate
和类似的Style
,它们工作得很好。我做错了什么?是ListBox
吗?ListBox
验证工作是否不同?
事实上,问题是您没有为验证触发PropertyChanged
事件。
但是我可以在你的代码中看到另一个问题。你已经为列表框上的工具提示设置了本地值:
ToolTip="{x:Static res:Car.EditDataRetention_AlarmClasses_ToolTip}"
但是你想要不同的工具提示,以防验证返回一些你在样式触发器中定义的错误。
但是,局部值比样式触发器具有更高的优先级。因此,您的工具提示永远不会被设置。因此,您应该将工具提示移动到样式设置器中:
<Setter Property="ToolTip"
Value="{x:Static res:Car.EditDataRetention_AlarmClasses_ToolTip}"/>
MSDN link -依赖属性值优先。
我在这篇文章中找到了我的问题的答案。事实证明,当复选框发生变化时,我必须触发PropertyChanged
事件,以便触发Validation逻辑。由于ListBox
中的项目实现了INotifyPropertyChanged
,因此很容易为每个项目添加一个事件侦听器,因为它被添加到ListBox
中,从而引发必要的事件。
谢谢。