Отключить выбор разделителя в комбинированном окне с привязкой к данным в WPF - PullRequest
2 голосов
/ 24 ноября 2010

У меня есть поле со списком, которое привязано к данным. В этом списке мне нужен разделитель. Так как это связано с данными, я делаю нечто очень похожее на этот пост . Моя база данных возвращает список, включает '-', чтобы отметить, куда должен идти разделитель, и сборщик данных делает это разделителем.

<ComboBox Name="cbAction" Grid.Column="1" Grid.Row="0" Margin="5,2,5,2" DisplayMemberPath="Description" SelectedValuePath="Code" SelectionChanged="cbAction_SelectionChanged">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}" BasedOn="{StaticResource {x:Type ComboBoxItem}}">
             <Style.Triggers>
                <DataTrigger Binding="{Binding Code}" Value="-">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                                <Separator HorizontalAlignment="Stretch" IsEnabled="False"/>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ComboBox.ItemContainerStyle>
</ComboBox>

Это работает в основном нормально, за исключением проблемы, которая у меня здесь есть, и незначительной проблемы с дизайном (которую я поставлю в другом вопросе).

При использовании мыши пользователь не может выбрать разделитель, что является правильным. Но если пользователь использует стрелки вверх / вниз для выбора элементов, он может выбрать разделитель. Это не стандартное поведение, которое пропускает разделитель.

Как сделать так, чтобы этот разделитель вел себя так же, как если бы ваш XAML имел различные ComboBoxItems и элемент Separator (пропуская разделитель при использовании клавиш вверх и вниз)

Ответы [ 3 ]

3 голосов
/ 24 ноября 2010

Вместо того, чтобы устанавливать «Фокусируемый» как предложено Meleak, установите «IsEnabled» в false вместо этого в Сеттере.

<DataTrigger Binding="{Binding Code}" Value="-"> 
    <Setter Property="IsEnabled" Value="False"/>
    <Setter Property="Template"> 
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
                <Separator HorizontalAlignment="Stretch"/> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</DataTrigger> 
2 голосов
/ 26 ноября 2010

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

Я установил связанный элемент данных как NULLИ мой XAML выглядит так:

<DataTrigger Binding="{Binding}" Value="{x:Null}">
    <Setter Property="IsEnabled" Value="False"/>
    <Setter Property="Template"> 
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
                <Separator HorizontalAlignment="Stretch"/> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</DataTrigger>
1 голос
/ 24 ноября 2010

Выбираемый элемент - это не сам разделитель, а ComboBoxItem, содержащий разделитель.
Попробуйте установить Focusable = "False" в DataTrigger. Это должно сделать ComboBoxItem «невыбираемым»

Обновление
Фиксированная позиция Setter

<DataTrigger Binding="{Binding Code}" Value="-"> 
    <Setter Property="Focusable" Value="False"/>
    <Setter Property="Template"> 
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
                <Separator HorizontalAlignment="Stretch" IsEnabled="False"/> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</DataTrigger> 
...