【问题标题】:XAML: Show button on ComboBox item highlightXAML:在组合框项目突出显示上显示按钮
【发布时间】:2026-01-10 21:35:01
【问题描述】:

我有一个带有 ItemTemplateSelector 的 ComboBox,使用 2 个不同的 DataTemplates,一个用于下拉可见,另一个用于不可见。对于下拉模板,每个 ComboBox 项目都由 TextBlockButton 表示,只有在该项目被聚焦/突出显示/鼠标悬停时才应该可见。这是我尝试过的:

    <ComboBox x:Name="Windows" ItemsSource="{Binding Windows}" SelectedItem="{Binding Window}" Focusable="False" MaxDropDownHeight="238">
        <ComboBox.ItemTemplateSelector>
            <s:ComboBoxItemTemplateSelector>
                <s:ComboBoxItemTemplateSelector.SelectedTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding TitleShort}" ToolTip="{Binding Title}" />
                    </DataTemplate>
                </s:ComboBoxItemTemplateSelector.SelectedTemplate>
                <s:ComboBoxItemTemplateSelector.DropDownTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" VerticalAlignment="Center">                        
                            <TextBlock Text="{Binding TitleShort}" />
                            <Button Content="X">
                                <Button.Style>
                                    <Style TargetType="Button">
                                        <Setter Property="Visibility" Value="Collapsed" />
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding IsFocused, ElementName=Windows}" Value="True">
                                                <Setter Property="Visibility" Value="Visible" />
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </Button.Style>
                            </Button>
                        </StackPanel>
                    </DataTemplate>
                </s:ComboBoxItemTemplateSelector.DropDownTemplate>
            </s:ComboBoxItemTemplateSelector>
        </ComboBox.ItemTemplateSelector>
        <ComboBox.ItemContainerStyle>
            <Style BasedOn="{StaticResource MaterialDesignComboBoxItemStyle}" TargetType="ComboBoxItem">
                <Setter Property="ToolTip">
                    <Setter.Value>
                        <TextBlock Text="{Binding Title}" />
                    </Setter.Value>
                </Setter>
            </Style>
        </ComboBox.ItemContainerStyle>
    </ComboBox>
    public class ComboBoxItemTemplateSelector : DataTemplateSelector
    {
        public DataTemplate SelectedTemplate { get; set; }
        public DataTemplate DropDownTemplate { get; set; }
    
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            ComboBoxItem comboBoxItem = GetVisualParent<ComboBoxItem>(container);
    
            if (comboBoxItem == null)
            {
                return SelectedTemplate;
            }
    
            return DropDownTemplate;
        }
    
        private static T GetVisualParent<T>(object childObject) where T : Visual
        {
            DependencyObject child = childObject as DependencyObject;
    
            while ((child != null) && !(child is T))
            {
                child = VisualTreeHelper.GetParent(child);
            }
    
            return child as T;
        }
    }

【问题讨论】:

  • 你也可以粘贴sComboBoxItemTemplateSelector的定义
  • @LeiYang 我不认为这很重要,因为它只是包装了DataTemplate,但无论如何我已经更新了这个问题。问题在于 DataTrigger 的绑定以表示当前突出显示的项目。

标签: c# wpf xaml combobox datatemplate


【解决方案1】:

ComboBox 生成 ComboBoxItem 作为其 itemssource 中每个项目的容器。您可以使用 RelativeSource 绑定来绑定到它的属性。

这应该会让你得到预期的行为:

        <Button Content="X">
          <Button.Style>
            <Style TargetType="Button">
              <Setter Property="Visibility" Value="Collapsed" />
              <Style.Triggers>
                <DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=ComboBoxItem}}" Value="True">
                  <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
              </Style.Triggers>
            </Style>
          </Button.Style>
        </Button>

【讨论】:

    最近更新 更多