Как скрыть раскрывающийся список ComboBox при нажатии на один из его ComboBoxItem-ов, когда ComboBox находится внутри DataGridComboBoxColumn? - PullRequest
0 голосов
/ 06 мая 2019

Ниже приведена полная разметка XAML (код не требуется): Window с Grid с DataGrid с одним столбцом типа DataGridComboBoxColumn с его Header и EditingElementStyle свойства установлены в XAML.EditingElementStyle устанавливает ItemContainerStyle и ItemsSource ComboBox es.Когда я нажимаю ComboBoxItem, раскрывающийся список не закрывается, и мне нужно закрыть его.

Я попытался удалить все содержимое элемента DataGridComboBoxColumn, и раскрывающийся список там, пустойно не исчезает при нажатии на него.

Раскрывающийся список также исчезает, когда я щелкаю вне раскрывающегося списка.

Если я просто добавлю это в простое Window:

<ComboBox>
    <ComboBoxItem>a</ComboBoxItem>
    <ComboBoxItem>b</ComboBoxItem>
    <ComboBoxItem>c</ComboBoxItem>
</ComboBox>

работает.

XAML

<Window x:Class="cs_wpf_test_11.TestWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:cs_wpf_test_11"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="TestWindow" Height="450" Width="800">
    <Grid>
        <DataGrid AutoGenerateColumns="False">
            <DataGrid.ItemsSource>
                <x:Array Type="{x:Type sys:String}">
                    <sys:String>dummy 1</sys:String>
                    <sys:String>dummy 2</sys:String>
                </x:Array>
            </DataGrid.ItemsSource>
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="My only column">
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemContainerStyle">
                                <Setter.Value>
                                    <Style TargetType="ComboBoxItem">
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate>
                                                    <ComboBoxItem Content="{Binding}"/>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </Setter.Value>
                            </Setter>
                            <Setter Property="ItemsSource">
                                <Setter.Value>
                                    <x:Array Type="{x:Type sys:String}">
                                        <sys:String>test 1</sys:String>
                                        <sys:String>test 2</sys:String>
                                        <sys:String>test 3</sys:String>
                                        <sys:String>test 4</sys:String>
                                    </x:Array>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Ожидается: раскрывающееся меню ComboBox закрывается, когда я нажимаю на одну из ComboBoxItem s.,Фактический результат: раскрывающийся список остается открытым.

Обновление

Я хочу использовать установщик ItemContainerStyle, потому что я изменяю FontStyle некоторых ComboBoxItem-ов на основе привязки.Это код из более крупного проекта:

<ComboBoxItem FontStyle="{Binding Path=Style}" Content="{Binding Text}"/>

На основании принятого ответа я использую этот код для того же эффекта, и проблема решена:

<Setter Property="ItemContainerStyle">
    <Setter.Value>
        <Style TargetType="ComboBoxItem">
            <Setter Property="FontStyle" Value="{Binding Style}"/>
        </Style>
    </Setter.Value>
</Setter>

1 Ответ

1 голос
/ 06 мая 2019

Проблема в вашем ItemContainerStyle. Удалите эту часть, и она работает как положено.

Вот то, из чего состоит элемент по умолчанию ItemContainerStyle. Вы можете использовать его как основу, но если вы создаете новый пустой, вы все это исключаете.

<ControlTemplate TargetType="{x:Type ComboBoxItem}">
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
    </Border>
    <ControlTemplate.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="False"/>
                <Condition Property="IsMouseOver" Value="True"/>
                <Condition Property="IsKeyboardFocused" Value="False"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHover.Background}"/>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHover.Border}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True"/>
                <Condition Property="IsMouseOver" Value="False"/>
                <Condition Property="IsKeyboardFocused" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelected.Background}"/>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelected.Border}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True"/>
                <Condition Property="IsMouseOver" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedHover.Background}"/>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedHover.Border}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="True"/>
                <Condition Property="IsMouseOver" Value="False"/>
                <Condition Property="IsKeyboardFocused" Value="False"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedNoFocus.Background}"/>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewSelectedNoFocus.Border}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="False"/>
                <Condition Property="IsMouseOver" Value="False"/>
                <Condition Property="IsKeyboardFocused" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewFocus.Border}"/>
        </MultiTrigger>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsSelected" Value="False"/>
                <Condition Property="IsMouseOver" Value="True"/>
                <Condition Property="IsKeyboardFocused" Value="True"/>
            </MultiTrigger.Conditions>
            <Setter Property="Background" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHoverFocus.Background}"/>
            <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource ComboBoxItem.ItemsviewHoverFocus.Border}"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>
...