带有ListBox的窗口不会在ListBox上显示错误

时间:2014-03-14 17:00:16

标签: c# wpf validation

我的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验证的工作方式不同吗?

2 个答案:

答案 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,从而引发必要的事件。

非常感谢。