Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disallow/Block selection of disabled combobox item in wpf

I'm writing an application wherein I would like to disable few items in the ComboBox and also want to disallow/block selection of disabled items. Please note ComboBox in main window has another ComboBox as ComboBox Item init (that is decided at run time by data template selector).

With below code I'm able to disable a ComboBox within ComboBox but it would not stop user from selecting that disabled ComboBox item. Any help in disallow/block selection of disabled items would be helpful.

Below are the code snippets

ComboBox in main window:

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

Data template selector:

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

Data templates for above 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> 
like image 303
vmore Avatar asked Jan 02 '14 19:01

vmore


2 Answers

You can achieve this by setting IsEnabled property of a ComboBoxItem to false;

So each item in ComboBox's ItemSource (i.e. Cars in your case) can be an object having some property (say IsSelectable) specifying whether it should be enabled or disabled and then use it with a style to make an item un-selectable. something like this -

<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> 
like image 78
akjoshi Avatar answered Sep 18 '22 18:09

akjoshi


To solve the problem pointed by @JordyBoom.

ItemsContainerGenerator does not generate items until dropdown is opened at least once.

So if you open the drop down and close it again in window’s loaded event handler then all supposed to work fine with mouse as well as with keyboard selection.

    public MainWindow()     {         InitializeComponent();         this.Loaded += new RoutedEventHandler(onLoaded);     }      private void onLoaded(object sender, RoutedEventArgs e)     {          cmbx.IsDropDownOpen = true;          cmbx.IsDropDownOpen = false;     } 

source: WPF: Making combo box items disabled – also when accessed using the keyboard

like image 39
Flot2011 Avatar answered Sep 19 '22 18:09

Flot2011