2015-01-04 55 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; 
     } 
    } 
}