对数据绑定的WPF ComboBoxItem进行样式化时出现问题

本文关键字:问题 样式 数据绑定 WPF ComboBoxItem | 更新日期: 2023-09-27 18:09:56

我有一个ComboBox,绑定到一个数据表。我试图添加一个额外的ComboBoxItem到列表的顶部,在那里我可以把一个链接自定义列表。目前,我只是在我的数据表的顶部插入一个虚拟行,然后在组合框上使用DataTrigger使其正确显示。但是,我没有得到正确的结果。

我试过两种方法。在第一个中,我的DataTrigger用一个包含TextBlock的ControlTemplate替换了虚拟项。

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ComboBoxItem">
                                <TextBlock Text="Customize..." />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

结果看起来是正确的,但是在该项上没有鼠标悬停突出显示。列表的其余部分工作正常,但当我将鼠标移到其中一个项目上时,它根本没有反应。我试过添加额外的触发器和样式来应用鼠标悬停效果,但我没有得到任何改变。

我尝试的第二种方法只是改变项目的外观,而不是完全用ControlTemplate替换它。

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding}" DisplayMemberPath="wellId">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Content" Value="Customize..." />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

这个功能像一个普通的列表项,鼠标悬停工作良好。然而,该项是空白的。原始文本和我尝试在DataTrigger中设置的文本都不存在。没有错误,只是一个空的列表项。

有更好的方法来完成这个吗?

对数据绑定的WPF ComboBoxItem进行样式化时出现问题

删除DisplayMemberPath并添加默认内容到样式

<ComboBox IsEditable="True" Name="comboWell" ItemsSource="{Binding }">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Content" Value="{Binding wellId}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding wellId}" Value="(settings)">
                    <Setter Property="Content" Value="Customize..." />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

DisplayMemberPath实际上是说项目模板应该只是一个TextBlock与它的文本绑定到DisplayMemberPath项目的快捷方式,我猜它是覆盖任何你在风格。