【问题标题】:C# multiple combobox with the same itemssource具有相同项目源的 C# 多个组合框
【发布时间】:2017-07-03 12:38:13
【问题描述】:

我有两个组合框,两者的项目源是相同的。

List<string> cars = new List<string>();
cars.Add("Audi");
cars.Add("BMW");
cars.Add("Mercedes-Benz");

this.ComboBox1.ItemsSource = cars;
this.ComboBox2.ItemsSource = cars;

假设我在ComboBox1 中选择了“奥迪”。我想要的是在ComboBox1 中选择“Audi”时删除/禁用ComboBox2 中的“Audi”。

有人可以帮我解决这个问题吗? (我是 c#/wpf 编程新手)

【问题讨论】:

  • 你应该看看 MVVM 模式和ICollectionView。当您至少不了解 MVVM 时,这很容易实现,但很难解释。

标签: c# wpf combobox


【解决方案1】:

公开定义2个列表

List<string> cars = new List<string>();
List<string> cars2 = new List<string>();

public CarsView()
    {
        InitializeComponent();

        cars.Add("Audi");
        cars.Add("BMW");
        cars.Add("Mercedes-Benz");

        this.ComboBox1.ItemsSource = cars;
        this.ComboBox2.ItemsSource = cars;
    }

而且你的功能一定是这样的

private void ComboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox2.SelectedIndex = -1;
            string cb1 = ComboBox1.SelectedValue as string;
            cars2.Clear();
            cars2.AddRange(cars);
            cars2.Remove(cb1);
            ComboBox2.ItemsSource = null;
            ComboBox2.ItemsSource = cars2;
        }

【讨论】:

    【解决方案2】:

    遍历第二个组合框项目并检查从第一个组合框中选择的项目是否存在于第二个组合框中,如果存在,则将其删除,例如:

    private void comboBox1Changed(object sender, SelectionChangedEventArgs e)
    {
        for (int i = 0; i < comboBox2.Items.Count; i++)
        {
            if ((ComboBoxItem)comboBox2.Items[i] == comboBox1.SelectedItem)
            {
               comboBox2.Items.Remove((ComboBoxItem)comboBox2.Items[i]);
            }
        }
    }
    

    如果您想禁用项目而不将其从列表中删除,您可以这样做,因为下拉列表中的ListItems 具有Enabled 属性。您可以将其设置为 false 以禁用它们。

    【讨论】:

    • 感谢您的回答,但我收到此错误:附加信息:无法将“System.String”类型的对象转换为“System.Windows.Controls.ComboBoxItem”类型。
    • 当他第二次更改第一个组合框时,第二个组合框将不再包含以前的项目。我会建议一个主列表并使用 linq 表达式更新组合框的数据源。
    • @TestMan 您确定您像我在帖子中所做的那样将项目投射到组合框项目吗? (ComboBoxItem)comboBox2.Items[i]
    • @SebastianSchulz 那么最好保持禁用/启用而不删除它..
    • @Roxy'Pro for (int i = 0; i &lt; ComboBox2.Items.Count; i++) { if (ComboBox2.Items[i] == ComboBox1.SelectedItem) { ComboBox2.Items.Remove((ComboBoxItem)ComboBox2.Items[i]); } }
    【解决方案3】:
        List<string> MasterListCars = new List<string>();
        List<string> TempListCars = new List<string>();
        public MainWindow()
        {
            InitializeComponent();
            MasterListCars.Add("Audi");
            MasterListCars.Add("BMW");
            MasterListCars.Add("Mercedes");
            Cb1.ItemsSource = MasterListCars;
        }
    
        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            TempListCars = MasterListCars.Where(x => x != Cb1.SelectedItem.ToString()).ToList();
            cb2.ItemsSource = MasterListCars;
        }
    

    这样您就不必担心添加或删除项目。 如果您想在启动时填充组合框2,请添加到 MainWindow():

    cb2.ItemsSource = MasterLineCars;
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多