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>
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>
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With