2015-01-04 76 views
0

我有几个组合框,所有共享同一组的选项。 如何绑定组合框,以便在任何组合框上选择一个选项时,该选项将不可用于其余组件?这包括以前选择的组合框 - 如果我要重新选择以前占用的组合框的选项,则可用选项将除已在其他组合框上选择的选项外。互斥组合框在WPF

这里的一个更详细的解释:

假设我有3个组合框:COMBO1,Combo2,Combo3,和可用的4项,( “A”, “B”, “C”, “d”) 。

  1. 我选择上COMBO1 “A”。组合2和组合3将具有“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)); 
     } 
    } 

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

+0

WPF或WinForms的 – Paparazzi 2015-01-04 12:30:34

回答

0
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"); 
    } 
} 
-1

我得到了四个组合框的工作就像你想要它,但它是粗糙的版本..

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; 
     } 
    } 
}