具有相同 Itemsource 但 SelectedItem 应该不同的多个 Combobox - WPF

Multiple Combobox with same Itemsource but the SelectedItem should be different - WPF

目标 是拥有多个 Combobox,一旦在任何 Combobox 中选择了该项目,就应该将其从其他 [= =12=]供选择。

每当 Comboboxes 上的选择发生变化时,我都可以更改源。但是 问题 是当我从 ItemsSource 中删除所选项目时,项目从所有来源中删除,包括我选择的来源。

这是示例

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 我可以有多个集合,但是如果 Combobox 的数量增加,这可能会占用大量内存。

希望,在 WPF 中应该有一个简单的方法来实现这一点。

您可以为每个 ComboBox 定义不同的 SelectedItem,然后为每个 ComboBox 创建 SharedItemSource 的包装器以过滤掉 SelectedItem其他 ComboBox。例如:

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:

<ComboBox SelectedItem="{Binding SelectedItem1}" ItemsSource="{Binding ComboboxItems1}" />
<ComboBox  SelectedItem="{Binding SelectedItem2}" ItemsSource="{Binding ComboboxItems2}" />
<ComboBox  SelectedItem="{Binding SelectedItem3}" ItemsSource="{Binding ComboboxItems3}" />