在wpf中禁止/阻止选择禁用的组合框项目

 双子座-海_358 发布于 2023-02-06 21:44

我正在编写一个应用程序,其中我想禁用其中的几个项目,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:禁用组合框项目 - 使用键盘访问时也是如此

2 个回答
  • 您可以通过设置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>
    

    2023-02-06 21:50 回答
  • 解决@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:禁用组合框项目 - 使用键盘访问时也是如此

    2023-02-06 21:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有