2016-05-18 9 views
3

目標アイテムがComboboxのいずれかで選択されると、複数Comboboxを有することである、それを除去または選択のための他のCombobox ESから隠してなければなりません。複数のコンボボックスは異なるべきである - WPF

Comboboxのいずれかで選択が変更されたときはいつでも、ソースを変更することができます。しかし問題は、選択したアイテムをItemsSourceから削除すると、選択したアイテムを含むすべてのソースからアイテムが削除されました。ここで

は私が各Comboboxに対して複数のコレクションを持つことができます知っているが、場合には、大量のメモリをとることができ、サンプル

XAML

<StackPanel> 
    <ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" /> 
    <ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" /> 
    <ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" /> 
    <ComboBox Width="100" Height="50" SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ComboboxItems}" /> 
</StackPanel> 

分離コード

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ObservableCollection<string> s = new ObservableCollection<string>(); 
     s.Add("item1"); 
     s.Add("item2"); 
     s.Add("item3"); 
     s.Add("item4"); 
     s.Add("item5"); 
     s.Add("item6"); 

     DataContext = new MainViewModel() { ComboboxItems = s , SelectedItem = "item2" }; 

    } 
} 

public class MainViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<string> comboboxitems; 

    public ObservableCollection<string> ComboboxItems 
    { 
     get { return comboboxitems; } 
     set { comboboxitems = value; OnPropertyChanged("ComboboxItem"); } 
    } 

    private string _selectedItem; 

    public string SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      comboboxitems.Remove(value); //here removing selected item from itemssource 
      OnPropertyChanged("SelectedItem"); 
     } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 

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

ですComboboxの数が増加します。

希望すると、これをWPFで簡単に実現できるはずです。

+1

。たとえばSelectedItem1、SelectedItem2などがありますが、ItemsSourceは共有できます。 – adminSoftDK

+0

CollectionViewまたはCollectionViewSourceを使用します。これは、実際のソースのプロキシです。これにより、Viewプロパティを介して共通のソースを共有することができ、各CollectionViewに対して異なる選択項目(CurrentItem)を持つことができます。 – codeSetter

+0

@adminSoftDKはい、できますが、他の 'Combobox'の項目から項目を削除したり、選択を制限するにはどうしたらいいですか? – Gopichandar

答えて

3

あなたは、各ComboBoxに異なるSelectedItemを定義し、他のComboBoxSelectedItemをフィルタリングするために、各ComboBoxためSharedItemSourceのラッパーを作成することができます。例えば:

のC#:

public IEnumerable<string> ComboboxItems1 
    { 
     get 
     { 
      return ComboboxItems.Where(x => x != SelectedItem2 && x != SelectedItem3); 
     } 
    } 

    public string SelectedItem1 
    { 
     get { return _selectedItem1; } 
     set 
     { 
      if (_selectedItem1 != value) 
      { 
       _selectedItem1 = value; 
       RaisePropertyChanged("SelectedItem1"); 
       RaisePropertyChanged("ComboboxItems2"); //raise propertychanged to refresh GUI 
       RaisePropertyChanged("ComboboxItems3"); 
      } 
     } 
    }  

    public IEnumerable<string> ComboboxItems2 
    { 
     get 
     { 
      return ComboboxItems.Where(x => x!=SelectedItem1&&x!=SelectedItem3); 
     } 
    } 

    public string SelectedItem2 
    { 
     get { return _selectedItem2; } 
     set 
     { 
      if (_selectedItem2 != value) 
      { 
       _selectedItem2 = value;     
       RaisePropertyChanged("SelectedItem2"); 
       RaisePropertyChanged("ComboboxItems1"); //raise propertychanged to refresh GUI 
       RaisePropertyChanged("ComboboxItems3"); 
      } 
     } 
    } 

    public IEnumerable<string> ComboboxItems3 
    { 
     get 
     { 
      return ComboboxItems.Where(x => x != SelectedItem1 && x != SelectedItem2); 
     } 
    } 

    public string SelectedItem3 
    { 
     get { return _selectedItem3; } 
     set 
     { 
      if (_selectedItem3 != value) 
      { 
       _selectedItem3 = value;     
       RaisePropertyChanged("SelectedItem3"); 
       RaisePropertyChanged("ComboboxItems1"); //raise propertychanged to refresh GUI 
       RaisePropertyChanged("ComboboxItems2"); 
      } 
     } 
    } 

XAML:

さてあなたは、私は信じている各コンボボックスに1つずつ、複数のSelectedItemプロパティを作成する必要があります。この場合、
<ComboBox SelectedItem="{Binding SelectedItem1}" ItemsSource="{Binding ComboboxItems1}" /> 
<ComboBox SelectedItem="{Binding SelectedItem2}" ItemsSource="{Binding ComboboxItems2}" /> 
<ComboBox SelectedItem="{Binding SelectedItem3}" ItemsSource="{Binding ComboboxItems3}" /> 
+0

。 'ItemsSource'が' SelectedItem1'をリフレッシュするとき、 'Stack overflow'例外に繋がります。 – Gopichandar

+0

ブレークポイントを設定し、例外に関する詳細情報を取得できますか? – Bolu

+0

はい。 OnPropertyChanged( "ComboboxItems1");でデッドロックにつながる 'SelectedItem1'の' Set'を再度トリガします。 – Gopichandar

関連する問題