将多个组合框绑定到一个筛选列表

时间:2017-05-21 09:54:36

标签: c# wpf xaml

我有三个组合框都绑定到同一个列表:

List:
a
b
c

我想限制组合框下拉列表,以便当从其中一个组合框中选择一个项目时,用户不能多次设置相同的项目

cmb1: Available = a, b, c
cmb2: Available = a, b, c
cmb3: Available = a, b, c

用户选择cmb1

cmb1: Available = b, c Selected = a
cmb2: Available = b, c
cmb3: Available = b, c

用户在cmb2

上选择b
cmb1: Available = c Selected = a
cmb2: Available = c Selected = b
cmb3: Available = c

用户将cmb1更改为c

cmb1: Available = a Selected = c
cmb2: Available = a Selected = b
cmb3: Available = a

我已经尝试过CollectionViewSource,getter属性,但我无法让每个组合框保持其他人的变化。关于如何在wpf中做任何提示?

1 个答案:

答案 0 :(得分:0)

每个ComboBox的集合

为每个ComboBox创建一个集合实例,并手动管理它们的项目。

每个ComboBox IEnumerable

假设您有一个包含所有可用项的List的ViewModel。 此外,您还拥有SelectedItem1SelectedItem2SelectedItem3属性。

您可以为每个ComboBox创建简单IEnumerable<T>,并在更改其中一个选定项目后调用NotifyPropertyChanged

public IEnumerable<string> List1 => List.Except(new[] { SelectedItem2, SelectedItem3 });
public IEnumerable<string> List2 => List.Except(new[] { SelectedItem1, SelectedItem3 });
public IEnumerable<string> List3 => List.Except(new[] { SelectedItem1, SelectedItem2 });

您只需更新所选项目的所有属性,如下所示:

private string _selectedItem1;
public string SelectedItem1
{
    get { return _selectedItem1; }
    set
    {
        _selectedItem1 = value;
        NotifyPropertyChanged(nameof(SelectedItem1));
        NotifyPropertyChanged(nameof(List2));
        NotifyPropertyChanged(nameof(List3));
    }
}
// etc

如果您的主列表可以更改,您还应该注意更新您的从属列表:

List.CollectionChanged += (o, e) =>
{
    NotifyPropertyChanged(nameof(List1));
    NotifyPropertyChanged(nameof(List2));
    NotifyPropertyChanged(nameof(List3));
};

但如果您有很多物品,这会对性能造成不利影响。调用NotifyPropertyChanged之后,您的ComboBox应该重新初始化所有项目。