2015-04-07 53 views
1

不結合我有3個組合框WPF組合框上變化

<Grid> 
    <ComboBox Name="cbo1" SelectionChanged="OnComboBoxChanged" /> 
    <ComboBox Name="cbo2" SelectionChanged="OnComboBoxChanged"/> 
    <ComboBox Name="cbo3" SelectionChanged="OnComboBoxChanged" /> 

組合框的列表是這樣,如果「B」中的第一個框被選中,那麼{A,B,C,d} 下拉不應該有b,如果第二個設置爲最後一個需要{c,d},則需要用{a,c,d}更新。如果他們返回並更改任何我們需要相應地更新列表。我添加了一個事件oncomboboxchanged,但它不更新組合框,當我設置項目源到新的列表。

private List<string> comboList = new List<string>(); 
string[] defaultParam = { "A", "B", "C", "D" }; 

public MainWindow() 
{ 
     InitializeComponent(); 
     foreach(string s in defaultParam) 
     { 
      LoadCombo(s); 
     } 

} 
public void LoadCombo(string name) 
{ 
    comboList.Add(name); 
    cbo1.ItemsSource = comboList; 
    cbo2.ItemsSource = comboList; 
    cbo3.ItemsSource = comboList; 
} 
private void OnComboBoxChanged(object sender,SelectionChangedEventArgs e) 
{ 
    var combo = sender as ComboBox; 
    string oldval = combo.Text; 
    string id = combo.Name; 
    string itemSel = (sender as ComboBox).SelectedItem.ToString(); 
    comboList.Remove(itemSel); 
    //add old value only if it is not empty 
    if (!string.IsNullOrEmpty(oldval)) 
    { 
     comboList.Add(oldval); 
    } 
    combo.ItemsSource = comboList; 
    ComboBox[] comboNameLst = {cbo1,cbo2,cbo3 }; 
    foreach (ComboBox cbo in comboNameLst) 
    { 
     if (id != cbo.Name) 
     { 
      if (cbo.SelectedItem == null) 
      { 
       cbo.ItemsSource = comboList; 
      } 
      else if (cbo.SelectedItem != null) 
      { 
      string tempitemsel = cbo.SelectedItem.ToString(); 
      comboList.Add(tempitemsel); 
      cbo.ItemsSource = comboList; 
      comboList.Remove(tempitemsel); 
      } 
     } 
    } 
} 

所以cbo.ItemSource是沒有做任何事情,做我需要做任何的事情不同,所以我看到了更新。

+0

什麼是comboList?你在哪裏提供itemssource? – Muds

+0

我編輯帖子的代碼添加到項目源 – user565992

+0

如果您從第一秒選擇將有BCD,並且如果您在第二個A中選擇b仍然會有ABCD? – Muds

回答

3
  1. 您需要在XAML中使用綁定,而不是在後面的代碼中設置ItemsSource。同時數據綁定SelectedItem

    <Grid> 
        <ComboBox ItemsSource="{Binding DefaultList}" SelectedItem="{Binding SelectedItem_Cob1}"/> 
        <ComboBox ItemsSource="{Binding FilteredListA}" SelectedItem="{Binding SelectedItem_Cob2}"/> 
        <ComboBox ItemsSource="{Binding FilteredListB}" SelectedItem="{Binding SelectedItem_Cob3}"/> 
    </Grid> 
    
  2. 在後面的代碼中,你需要實現INotifyPropertyChanged;將相關的ItemsSources和SlectedItem定義爲屬性;並設置你的Windows的的DataContext到您的代碼本身(你應該使用MVVM模式,但你可以不用擔心以後):

    using System.ComponentModel; 
    public partial class MainWindow: INotifyPropertyChanged 
    { 
        string[] defaultParam = { "A", "B", "C", "D" }; 
        private string _selecteditem_cob1; 
        private string _selecteditem_cob2; 
        private string _selecteditem_cob3; 
    
        public List<string> DefaultList 
        { 
         get { return defaultParam.ToList(); } 
        } 
    
        public string SelectedItem_Cob1 
        { 
         get { return _selecteditem_cob1; } 
         set 
         { 
          if (_selecteditem_cob1 != value) 
          { 
           _selecteditem_cob1 = value; 
           RaisePropertyChanged("SelectedItem_Cob1"); 
           RaisePropertyChanged("FilteredListA"); 
           RaisePropertyChanged("FilteredListB"); 
          } 
         } 
        } 
    
        public string SelectedItem_Cob2 
        { 
         get { return _selecteditem_cob2; } 
         set 
         { 
          if (_selecteditem_cob2 != value) 
          { 
           _selecteditem_cob2 = value; 
           RaisePropertyChanged("SelectedItem_Cob2"); 
           RaisePropertyChanged("FilteredListB"); 
          } 
         } 
        } 
    
        public string SelectedItem_Cob3 
        { 
         get { return _selecteditem_cob3; } 
         set 
         { 
          if (_selecteditem_cob3 != value) 
          { 
           _selecteditem_cob3 = value; 
           RaisePropertyChanged("SelectedItem_Cob3"); 
          } 
         } 
        } 
    
        public List<string> FilteredListA 
        { 
         get { return defaultParam.ToList().Where(a=>a!=SelectedItem_Cob1).ToList(); } 
        } 
        public List<string> FilteredListB 
        { 
         get { return FilteredListA.Where(a => a != SelectedItem_Cob2).ToList(); } 
        } 
        public MainWindow() 
        { 
    
         InitializeComponent(); 
         this.DataContext=this;   
        } 
    
        //Implementation for INotifyPropertyChanged 
        public event PropertyChangedEventHandler PropertyChanged; 
    
        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) 
        { 
         var handler = this.PropertyChanged; 
         if (handler != null) 
         { 
          handler(this, e); 
         } 
        } 
    
        protected void RaisePropertyChanged(String propertyName) 
        { 
         OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); 
        } 
    } 
    

結果:

三個組合框都將顯示A, B,C,D在初始階段。並且 那麼如果用戶做出選擇cbo2cbo3只會動態顯示 過濾結果。

我意識到這不是100%你想要的東西(感謝@TheodosiusVonRichthofen),但我覺得你仍然可以使用它,並且能夠輕鬆修改它以滿足您的需求。

+0

非常感謝你的幫助,我試着用我的代碼實現這一點,但它的加載空的下拉框。 – user565992

+1

@ user565992,你添加了'this.DataContext = this; '在MainWindow的構造中'MainWindow()'? – Bolu

+0

再次感謝您!其加載項目。我需要添加oncombobox更改事件嗎?由於梳理盒仍顯示所有值 – user565992

1

另外,包含組合框項目的列表應該是ObservableCollection而不是List。通過將其設置爲ObservableCollection,當您添加/刪除/更改列表中的項目時,組合框項目將會更新。