我的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
验证的工作方式不同吗?
答案 0 :(得分:1)
确实问题是你没有提出PropertyChanged
事件让你的验证被解雇。
但我可以在你的代码中看到另外一个问题。您已在ListBox上为工具提示设置了本地值:
ToolTip="{x:Static res:Car.EditDataRetention_AlarmClasses_ToolTip}"
但是,如果验证返回了一些您在样式触发器中定义的错误,则需要不同的工具提示。
但是,本地值的优先顺序高于样式触发器。因此,您的工具提示永远不会被设置。因此,您应该将工具提示移至样式设置器以便工作:
<Setter Property="ToolTip"
Value="{x:Static res:Car.EditDataRetention_AlarmClasses_ToolTip}"/>
MSDN链接 - Dependency property value precedence。
答案 1 :(得分:0)
我找到了问题in this post的答案。事实证明,当复选框发生变化时,我必须引发PropertyChanged
事件,以便触发验证逻辑。由于ListBox
实施INotifyPropertyChanged
中的项目,因此很容易为每个项目添加事件监听器,因为它会添加到ListBox
,从而引发必要的事件。
非常感谢。