【问题标题】:Trouble styling data-bound WPF ComboBoxItem无法设置数据绑定 WPF ComboBoxItem 的样式
【发布时间】:2011-09-27 17:05:20
【问题描述】:

我有一个 ComboBox,绑定到一个 DataTable。我正在尝试在列表顶部添加一个额外的 ComboBoxItem,我可以在其中放置一个链接来自定义列表。目前我只是在我的 DataTable 顶部插入一个虚拟行,然后在 ComboBox 上使用 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 中设置的文本都不存在。没有错误,只是一个空列表项。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    删除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,其 Text 绑定到 DisplayMemberPath 项目,我猜它会覆盖您在 Style 中的任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2011-02-02
      相关资源
      最近更新 更多