2010-11-23 4 views
2

У меня есть Combo Box, который является привязкой к базе данных. В этом списке мне нужен разделитель. Поскольку это привязка данных, я делаю что-то очень похожее на this post. Моя база данных возвращает список, включая «-», чтобы отметить, куда должен идти разделитель, и datatrigger делает это разделителем.Отключить выбор разделителя в поле со списком данных в WPF

<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 и пункт Разделитель (пропуск через разделитель при использовании кнопок вверх и вниз)

ответ

3

Вместо установки "Focusable" как это было предложено Meleak, установите "IsEnabled" ложь вместо в сеттер.

<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> 
1

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

Update
Fixed сеттер Поместите

<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> 
+0

Это решает часть проблемы, но не полностью. Если у меня есть расширенное поле combobox, он больше не будет выбирать разделитель с помощью клавиш со стрелками. Но если combobox является текущей вкладкой, если вы будете, а не расширены, пользователь может использовать клавиши со стрелками вверх и вниз и по-прежнему выбирать разделитель. – jmlumpkin 2010-11-24 14:12:01

+0

Ах да, это правда, я только подумал о выпадающем списке. Для выбора непосредственно в ComboBox вам придется использовать IsEnabled вместо Focusable, как сказал karmicpuppet. – 2010-11-24 15:17:53

2

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

Я установил связанный элемент данных как 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> 
Смежные вопросы