带有列表框的窗口没有在列表框上显示错误

本文关键字:列表 显示 错误 窗口 | 更新日期: 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中,从而引发必要的事件。

谢谢。