我有三个组合框都绑定到同一个列表:
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
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中做任何提示?
答案 0 :(得分:0)
为每个ComboBox创建一个集合实例,并手动管理它们的项目。
假设您有一个包含所有可用项的List
的ViewModel。
此外,您还拥有SelectedItem1
,SelectedItem2
和SelectedItem3
属性。
您可以为每个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应该重新初始化所有项目。