2014-01-02 2 views
14

Я пишу приложение, в котором я хотел бы отключить несколько элементов в ComboBox, а также хочу запретить/заблокировать выбор отключенных элементов. Обратите внимание, что ComboBox в главном окне имеет другой ComboBox как элемент ComboBox Item init (который определяется во время выполнения с помощью селектора шаблонов данных).Запретить/Блокировать выделение запрещенного элемента combobox в wpf

В приведенном ниже коде я могу отключить ComboBox внутри ComboBox, но это не помешает пользователю выбрать этот отключенный элемент ComboBox. Любая помощь в запрете/блоке выбора отключенных элементов будет полезна.

Ниже приведены фрагменты кода

ComboBox в главном окне: селектор шаблона

<Grid> 
    <ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" 
       Width="120" Margin="87.2,44.8,0,0" 
       ItemsSource="{Binding Cars}" 
       ItemsPanel="{DynamicResource ItemsPanelTemplateHorizontal}" 
       ItemTemplateSelector="{StaticResource QualityComboBoxTemplateSelector}" 
       SelectedItem="{Binding SelectedItm}"/> 
</Grid> 

данных:

public class QualityComboBoxTemplateSelector : DataTemplateSelector 
{ 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var element = container as FrameworkElement; 

     var dataTemplate = element.FindResource(((item is string) && item.Equals("Ferrari")) ? 
                 "DataTemplateTopLevelCombobox2" : "DataTemplateTopLevelCombobox1") as DataTemplate; 

     return dataTemplate; 
    } 
} 

шаблоны данных для выше ComboBox:

<DataTemplate x:Key="DataTemplateTopLevelCombobox1"> 
    <Border BorderBrush="Black" BorderThickness="1" > 
     <TextBlock HorizontalAlignment="Left" 
        TextWrapping="Wrap" Text="{Binding}"  
        VerticalAlignment="Top"/> 
    </Border> 
</DataTemplate> 

<DataTemplate x:Key="DataTemplateTopLevelCombobox2"> 
    <Border Width="100"> 
     <ComboBox Text="Custom" Height="21.96" 
     ItemsSource="{Binding DataContext.Models, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
     IsEnabled="{Binding DataContext.EnableCombo, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
    </Border> 
</DataTemplate> 

ответ

23

Вы можете достичь этого, установив IsEnabled свойство ComboBoxItem в false;

Таким образом, каждый элемент в ComboBox-х ItemSource (т.е. Cars в вашем случае) может быть объект, имеющий некоторое свойство (скажем IsSelectable) с указанием, должен ли он быть включен или выключен, а затем использовать его со стилем, чтобы сделать элемент ООН по выбору , что-то вроде этого -

<Style TargetType="ComboBoxItem"> 
    <Setter Property="IsEnabled" Value="{Binding IsSelectable}"/> 
</Style> 

Update:

<Grid> 
    <ComboBox 
     Width="120" 
     Margin="87.2,44.8,0,0" 
     HorizontalAlignment="Left" 
     VerticalAlignment="Top" 
     ItemTemplateSelector="{StaticResource QualityComboBoxTemplateSelector}" 
     ItemsPanel="{DynamicResource ItemsPanelTemplateHorizontal}" 
     ItemsSource="{Binding Cars}" 
     SelectedItem="{Binding SelectedItm}"> 
     <ComboBox.ItemContainerStyle> 
      <Style TargetType="ComboBoxItem"> 
       <Setter 
        Property="IsEnabled" 
        Value="{Binding IsSelectable}" /> 
      </Style> 
     </ComboBox.ItemContainerStyle> 
    </ComboBox> 
</Grid> 
+0

На самом деле я не использую ComboboxItemStyle, я использую DataTemplate. – vmore

+0

@vmore Я обновил свой ответ, показывая, как вы можете применить стиль ComboBoxItem. – akjoshi

+0

Спасибо @akjoshi. Это сработало. – vmore

4

Чтобы решить эту проблему, на который указывает @JordyBoom.

ItemsContainerGenerator не создает элементы, пока раскрывающийся список не открывается хотя бы один раз.

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

public MainWindow() 
    { 
     InitializeComponent(); 
     this.Loaded += new RoutedEventHandler(onLoaded); 
    } 

    private void onLoaded(object sender, RoutedEventArgs e) 
    { 
     cmbx.IsDropDownOpen = true; 
     cmbx.IsDropDownOpen = false; 
    } 

Источник: WPF: Making combo box items disabled – also when accessed using the keyboard

+0

Спасибо.Клавиши со стрелками вверх и вниз могут использоваться для прохождения элементов до того, как комбо будет сброшено, и позволит выбирать без этого исправления. Отключенный элемент является разделителем для некоторых людей. –

Смежные вопросы