XAML:在组合框项目突出显示上显示按钮

问题描述

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

    <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;
        }
    }

解决方法

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

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

WHERE 
    st_contains(a.geometrie,b.geometrie) AND 
    st_contains(a.geometrie,b.geometrie) AND 
    st_covers(a.geometrie,b.geometrie) AND 
    st_coveredby(a.geometrie,b.geometrie) AND 
    st_intersects(a.geometrie,b.geometrie) 
    AND st_disjoint(a.geometrie,b.geometrie) 
    AND st_equals(a.geometrie,b.geometrie) 
    AND a.GID = '142284 '
GROUP BY b.SOUS_TYPE,b.TYPE_PRESCRIPTION,a.geometrie,b.geometrie,b.TRIG_COMM