我正在编写一个应用程序,其中我想禁用其中的几个项目,ComboBox
并且还想禁止/阻止选择禁用的项目.请注意,主窗口中的ComboBox有另一个ComboBox作为ComboBox项目初始化(由运行时由数据模板选择器决定).
使用下面的代码我可以在ComboBox中禁用ComboBox,但它不会阻止用户选择禁用的ComboBox项.禁止/阻止选择禁用物品的任何帮助都会有所帮助.
以下是代码段
主窗口中的ComboBox:
数据模板选择器:
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的数据模板:
akjoshi.. 31
您可以通过设置a的IsEnabled
属性来实现此ComboBoxItem
目的false
;
因此,ComboBox中的每个项目ItemSource
(即Cars
在您的情况下)可以是具有某些属性(例如IsSelectable
)的对象,指定是应该启用还是禁用它,然后将其与样式一起使用以使项目不可选.像这样的东西 -
更新:
这不是阻止选择的一致方法.您仍然可以通过将焦点置于控件中并键入以搜索它来选择禁用的项目.它会毫无问题地选择它. (5认同)
Flot2011.. 5
解决@JordyBoom指出的问题.
ItemsContainerGenerator
在下拉列表至少打开一次之前不会生成项目.
因此,如果您打开下拉菜单并在窗口加载的事件处理程序中再次关闭它,那么所有应该可以正常使用鼠标和键盘选择.
public MainWindow() { InitializeComponent(); this.Loaded += new RoutedEventHandler(onLoaded); } private void onLoaded(object sender, RoutedEventArgs e) { cmbx.IsDropDownOpen = true; cmbx.IsDropDownOpen = false; }
source:WPF:禁用组合框项目 - 使用键盘访问时也是如此
您可以通过设置a的IsEnabled
属性来实现此ComboBoxItem
目的false
;
因此,ComboBox中的每个项目ItemSource
(即Cars
在您的情况下)可以是具有某些属性(例如IsSelectable
)的对象,指定是应该启用还是禁用它,然后将其与样式一起使用以使项目不可选.像这样的东西 -
<Style TargetType="ComboBoxItem"> <Setter Property="IsEnabled" Value="{Binding IsSelectable}"/> </Style>
更新:
<Grid> <ComboBox 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>
解决@JordyBoom指出的问题.
ItemsContainerGenerator
在下拉列表至少打开一次之前不会生成项目.
因此,如果您打开下拉菜单并在窗口加载的事件处理程序中再次关闭它,那么所有应该可以正常使用鼠标和键盘选择.
public MainWindow() { InitializeComponent(); this.Loaded += new RoutedEventHandler(onLoaded); } private void onLoaded(object sender, RoutedEventArgs e) { cmbx.IsDropDownOpen = true; cmbx.IsDropDownOpen = false; }
source:WPF:禁用组合框项目 - 使用键盘访问时也是如此