【问题标题】:Mutually Exclusive Comboboxes in WPFWPF 中的互斥组合框
【发布时间】:2015-03-02 03:28:12
【问题描述】:

我有几个组合框,它们都共享相同的选项集。 如何绑定组合框,以便当我在任何组合框上选择一个选项时,该选项对其余组合框不可用?这包括以前选择的组合框 - 如果我要重新选择选项一个以前占用的组合框,可用的选项将是除了那些已经在其他组合框上选择的选项。

这里有更详细的解释:

假设我有 3 个组合框:Combo1、Combo2、Combo3 和 4 个可用项(“A”、“B”、“C”、“D”)。

  1. 我在 Combo1 上选择“A”。然后,Combo2 和 Combo3 将具有“B”、“C”和“D”。
  2. 然后我在 Combo2 上选择“C”。然后,Combo3 将提供“B”和“D”。
  3. 我单击当前在“A”处选择的 Combo1。 “A”、“B”和“D”选项可用。

我尝试了以下方法:

private ObservableCollection<string> _ItemList;
public ObservableCollection<string> ItemList
    {
        get
        {
            return _ItemList;
        }
        set
        {
            _ItemList = value;
            NotifyPropertyChanged("ItemList"); 
        }
    }

public void NotifyPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,new PropertyChangedEventArgs(name));
        }
    }

然后将每个 ComboBox 绑定到 ItemList。但是,每当我删除在其他组合框中选择的选项时,这些组合框就会变为空白。是为每个 ComboBox 维护不同 List 的唯一选择,还是有更优雅的解决方案?

【问题讨论】:

    标签: c# wpf winforms combobox


    【解决方案1】:
    private List<string> _ItemList = new List<string>();
    
    private string string1selected; 
    private string string2selected;
    
    public IEnemerable<string> ItemList1
    {
       get
       {
           return _ItemList.Where(x => x != String2selected);
       }
    }
    public string String2selected
    {
       get
       {
           return string2selected;
       }
       set 
       {
           if (string2selected == value) return;
           NotifypropertyChanged("String2selected");
           NotifypropertyChanged("ItemList1");
       }
    }
    

    【讨论】:

      【解决方案2】:

      我让四个 ComboBox 可以按照您的要求工作,但这是粗略的版本..

      WPF 版本。

      XAML:

      <Window x:Class="TestFourComboboxes.MainWindow"
              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
              Title="MainWindow" Height="350" Width="525">
          <Grid>
              <ComboBox x:Name="Combo_1" IsReadOnly="True" Width="200" Height="32" HorizontalAlignment="Left" Margin="10,50,0,0" VerticalAlignment="Top" SelectionChanged="Combo_1_SelectionChanged"/>
              <ComboBox x:Name="Combo_2" IsReadOnly="True" Width="200" Height="32" HorizontalAlignment="Right" Margin="0,50,10,0" VerticalAlignment="Top" SelectionChanged="Combo_2_SelectionChanged"/>
              <ComboBox x:Name="Combo_3" IsReadOnly="True" Width="200" Height="32" HorizontalAlignment="Left" Margin="10,0,0,50" VerticalAlignment="Bottom" SelectionChanged="Combo_3_SelectionChanged"/>
              <ComboBox x:Name="Combo_4" IsReadOnly="True" Width="200" Height="32" HorizontalAlignment="Right" Margin="0,0,10,50" VerticalAlignment="Bottom" SelectionChanged="Combo_4_SelectionChanged"/>
          </Grid>
      </Window>
      

      以及后面的代码:

      public partial class MainWindow : Window
      {
          string[] list = { "", "A", "B", "C", "D" };
          List<string> list1 = new List<string>() { "", "A", "B", "C", "D" };
          List<string> list2 = new List<string>() { "", "A", "B", "C", "D" };
          List<string> list3 = new List<string>() { "", "A", "B", "C", "D" };
          List<string> list4 = new List<string>() { "", "A", "B", "C", "D" };
          bool ListUpdating = false;
      
      
          public MainWindow()
          {
              InitializeComponent();
              foreach (string str in list)
              {
                  Combo_1.Items.Add(str);
                  Combo_2.Items.Add(str);
                  Combo_3.Items.Add(str);
                  Combo_4.Items.Add(str);
              }
          }
      
          private void Combo_1_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              if (ListUpdating == false)
              {
                  ListUpdating = true;
                  string combo1 = Combo_1.SelectedItem.ToString();
                  string combo2 = "";
                  string combo3 = "";
                  string combo4 = "";
      
                  try
                  {
                      combo2 = Combo_2.Text;
                  }
                  catch { }
                  try
                  {
                      combo3 = Combo_3.Text;
                  }
                  catch { }
                  try
                  {
                      combo4 = Combo_4.Text;
                  }
                  catch { }
      
      
                  if (combo1 == "")
                  {
                      for (int i = 0; i < list1.Count; i++)
                      {
                          if (!list2.Contains(list1[i]))
                          {
                              list2.Add(list1[i]);
                              Combo_2.Items.Clear();
                              list2.Sort();
      
                              for (int u = 0; u < list2.Count; u++)
                              {
                                  Combo_2.Items.Add(list2[u]);
                                  if (list2[u] == combo2)
                                      Combo_2.SelectedIndex = u;
                              }
                          }
                          if (!list3.Contains(list1[i]))
                          {
                              list3.Add(list1[i]);
                              Combo_3.Items.Clear();
                              list3.Sort();
      
                              for (int u = 0; u < list3.Count; u++)
                              {
                                  Combo_3.Items.Add(list3[u]);
                                  if (list3[u] == combo3)
                                      Combo_3.SelectedIndex = u;
                              }
                          }
                          if (!list4.Contains(list1[i]))
                          {
                              list4.Add(list1[i]);
                              Combo_4.Items.Clear();
                              list4.Sort();
      
                              for (int u = 0; u < list4.Count; u++)
                              {
                                  Combo_4.Items.Add(list4[u]);
                                  if (list4[u] == combo4)
                                      Combo_4.SelectedIndex = u;
                              }
                          }
                      }
                  }
                  else
                  {
                      for (int i = 0; i < Combo_2.Items.Count; i++)
                      {
                          if (combo1 == Combo_2.Items[i].ToString())
                          {
                              Combo_2.Items.RemoveAt(i);
                              list2.RemoveAt(i);
                              list2.Sort();
                              i = Combo_2.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_3.Items.Count; i++)
                      {
                          if (combo1 == Combo_3.Items[i].ToString())
                          {
                              Combo_3.Items.RemoveAt(i);
                              list3.RemoveAt(i);
                              list3.Sort();
                              i = Combo_3.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_4.Items.Count; i++)
                      {
                          if (combo1 == Combo_4.Items[i].ToString())
                          {
                              Combo_4.Items.RemoveAt(i);
                              list4.RemoveAt(i);
                              list4.Sort();
                              i = Combo_4.Items.Count;
                          }
                      }
                  }
      
                  ListUpdating = false;
              }
          }
      
          private void Combo_2_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              if (ListUpdating == false)
              {
                  ListUpdating = true;
                  string combo1 = "";
                  string combo2 = Combo_2.SelectedItem.ToString();
                  string combo3 = "";
                  string combo4 = "";
      
                  try
                  {
                      combo1 = Combo_1.Text;
                  }
                  catch { }
                  try
                  {
                      combo3 = Combo_3.Text;
                  }
                  catch { }
                  try
                  {
                      combo4 = Combo_4.Text;
                  }
                  catch { }
      
                  if (combo2 == "")
                  {
                      for (int i = 0; i < list2.Count; i++)
                      {
                          if (!list1.Contains(list2[i]))
                          {
                              list1.Add(list2[i]);
                              Combo_1.Items.Clear();
                              list1.Sort();
      
                              for (int u = 0; u < list1.Count; u++)
                              {
                                  Combo_1.Items.Add(list2[u]);
                                  if (list1[u] == combo1)
                                      Combo_1.SelectedIndex = u;
                              }
                          }
                          if (!list3.Contains(list2[i]))
                          {
                              list3.Add(list2[i]);
                              Combo_3.Items.Clear();
                              list3.Sort();
      
                              for (int u = 0; u < list3.Count; u++)
                              {
                                  Combo_3.Items.Add(list3[u]);
                                  if (list3[u] == combo3)
                                      Combo_3.SelectedIndex = u;
                              }
                          }
                          if (!list4.Contains(list2[i]))
                          {
                              list4.Add(list2[i]);
                              Combo_4.Items.Clear();
                              list4.Sort();
      
                              for (int u = 0; u < list4.Count; u++)
                              {
                                  Combo_4.Items.Add(list4[u]);
                                  if (list4[u] == combo4)
                                      Combo_4.SelectedIndex = u;
                              }
                          }
                      }
                  }
                  else
                  {
                      for (int i = 0; i < Combo_1.Items.Count; i++)
                      {
                          if (combo2 == Combo_1.Items[i].ToString())
                          {
                              Combo_1.Items.RemoveAt(i);
                              list1.RemoveAt(i);
                              list1.Sort();
                              i = Combo_1.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_3.Items.Count; i++)
                      {
                          if (combo2 == Combo_3.Items[i].ToString())
                          {
                              Combo_3.Items.RemoveAt(i);
                              list3.RemoveAt(i);
                              list3.Sort();
                              i = Combo_3.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_4.Items.Count; i++)
                      {
                          if (combo2 == Combo_4.Items[i].ToString())
                          {
                              Combo_4.Items.RemoveAt(i);
                              list4.RemoveAt(i);
                              list4.Sort();
                              i = Combo_4.Items.Count;
                          }
                      }
                  }
                  ListUpdating = false;
              }
          }
      
          private void Combo_3_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              if (ListUpdating == false)
              {
                  ListUpdating = true;
                  string combo1 = "";
                  string combo2 = "";
                  string combo3 = Combo_3.SelectedItem.ToString();
                  string combo4 = "";
      
                  try
                  {
                      combo1 = Combo_1.Text;
                  }
                  catch { }
                  try
                  {
                      combo2 = Combo_2.Text;
                  }
                  catch { }
                  try
                  {
                      combo4 = Combo_4.Text;
                  }
                  catch { }
      
                  if (combo3 == "")
                  {
                      for (int i = 0; i < list3.Count; i++)
                      {
                          if (!list1.Contains(list3[i]))
                          {
                              list1.Add(list3[i]);
                              Combo_1.Items.Clear();
                              list1.Sort();
      
                              for (int u = 0; u < list1.Count; u++)
                              {
                                  Combo_1.Items.Add(list1[u]);
                                  if (list1[u] == combo1)
                                      Combo_1.SelectedIndex = u;
                              }
                          }
                          if (!list2.Contains(list3[i]))
                          {
                              list2.Add(list3[i]);
                              Combo_2.Items.Clear();
                              list2.Sort();
      
                              for (int u = 0; u < list2.Count; u++)
                              {
                                  Combo_2.Items.Add(list2[u]);
                                  if (list2[u] == combo2)
                                      Combo_2.SelectedIndex = u;
                              }
                          }
                          if (!list4.Contains(list3[i]))
                          {
                              list4.Add(list3[i]);
                              Combo_4.Items.Clear();
                              list4.Sort();
      
                              for (int u = 0; u < list4.Count; u++)
                              {
                                  Combo_4.Items.Add(list4[u]);
                                  if (list4[u] == combo4)
                                      Combo_4.SelectedIndex = u;
                              }
                          }
                      }
                  }
                  else
                  {
                      for (int i = 0; i < Combo_2.Items.Count; i++)
                      {
                          if (combo3 == Combo_2.Items[i].ToString())
                          {
                              Combo_2.Items.RemoveAt(i);
                              list2.RemoveAt(i);
                              i = Combo_2.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_1.Items.Count; i++)
                      {
                          if (combo3 == Combo_1.Items[i].ToString())
                          {
                              Combo_1.Items.RemoveAt(i);
                              list1.RemoveAt(i);
                              i = Combo_1.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_4.Items.Count; i++)
                      {
                          if (combo3 == Combo_4.Items[i].ToString())
                          {
                              Combo_4.Items.RemoveAt(i);
                              list4.RemoveAt(i);
                              i = Combo_4.Items.Count;
                          }
                      }
                  }
                  ListUpdating = false;
              }
          }
      
          private void Combo_4_SelectionChanged(object sender, SelectionChangedEventArgs e)
          {
              if (ListUpdating == false)
              {
                  ListUpdating = true;
                  string combo1 = "";
                  string combo2 = "";
                  string combo3 = "";
                  string combo4 = Combo_4.SelectedItem.ToString();
      
                  try
                  {
                      combo1 = Combo_1.Text;
                  }
                  catch { }
                  try
                  {
                      combo2 = Combo_2.Text;
                  }
                  catch { }
                  try
                  {
                      combo3 = Combo_3.Text;
                  }
                  catch { }
      
                  if (combo4 == "")
                  {
                      for (int i = 0; i < list4.Count; i++)
                      {
                          if (!list1.Contains(list4[i]))
                          {
                              list1.Add(list4[i]);
                              Combo_1.Items.Clear();
                              list1.Sort();
      
                              for (int u = 0; u < list1.Count; u++)
                              {
                                  Combo_1.Items.Add(list1[u]);
                                  if (list1[u] == combo1)
                                      Combo_1.SelectedIndex = u;
                              }
                          }
                          if (!list2.Contains(list4[i]))
                          {
                              list2.Add(list4[i]);
                              Combo_2.Items.Clear();
                              list2.Sort();
      
                              for (int u = 0; u < list2.Count; u++)
                              {
                                  Combo_2.Items.Add(list2[u]);
                                  if (list2[u] == combo2)
                                      Combo_2.SelectedIndex = u;
                              }
                          }
                          if (!list3.Contains(list4[i]))
                          {
                              list3.Add(list4[i]);
                              Combo_3.Items.Clear();
                              list3.Sort();
      
                              for (int u = 0; u < list3.Count; u++)
                              {
                                  Combo_3.Items.Add(list3[u]);
                                  if (list3[u] == combo3)
                                      Combo_3.SelectedIndex = u;
                              }
                          }
                      }
                  }
                  else
                  {
                      for (int i = 0; i < Combo_2.Items.Count; i++)
                      {
                          if (combo4 == Combo_2.Items[i].ToString())
                          {
                              Combo_2.Items.RemoveAt(i);
                              list2.RemoveAt(i);
                              i = Combo_2.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_3.Items.Count; i++)
                      {
                          if (combo4 == Combo_3.Items[i].ToString())
                          {
                              Combo_3.Items.RemoveAt(i);
                              list3.RemoveAt(i);
                              i = Combo_3.Items.Count;
                          }
                      }
      
                      for (int i = 0; i < Combo_1.Items.Count; i++)
                      {
                          if (combo4 == Combo_1.Items[i].ToString())
                          {
                              Combo_1.Items.RemoveAt(i);
                              list1.RemoveAt(i);
                              i = Combo_1.Items.Count;
                          }
                      }
                  }
                  ListUpdating = false;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2015-09-01
        • 2013-04-07
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多