我正在使用标准的 wpf/mvvm 应用程序,我将组合框绑定到 ViewModel 上的集合。
我需要能够从下拉列表中取消选择一个项目。意思是,用户应该能够选择一些东西,然后决定他们想要取消选择它(选择无)。问题是我的绑定集合中没有空元素
我最初的想法只是在集合中插入一个新项目,这将导致集合顶部有一个空项目。
虽然这是一个 hack,但它会影响在视图模型上使用该集合的所有代码。
例如,如果有人要写
_myCollection.Frist(o => o.Name == "foo")
这将引发空引用异常。
可能的解决方法是:
_myCollection.Where(o => o != null).First(o => o.Name == "foo");
这将起作用,但无法确保该集合的任何未来使用不会导致任何中断。
什么是能够添加空项目以便用户取消选择的好模式/解决方案。(我也知道 CollectionView 结构,但对于如此简单的事情来说,这似乎有点过头了)
更新
接受@hbarck 的建议并实施了 CompositeCollection(快速概念证明)
public CompositeCollection MyObjects {
get {
var col = new CompositeCollection();
var cc1 = new CollectionContainer();
cc1.Collection = _actualCollection;
var cc2 = new CollectionContainer();
cc2.Collection = new List<MyObject>() { null }; // PROBLEM
col.Add(cc2);
col.Add(cc1);
return col;
}
}
此代码适用于现有的绑定(包括 SelectedItem),这很棒。
这样做的一个问题是,如果项目完全为空,则在选择它时永远不会调用 SelectedItem 设置器。
如果我将这一行修改为:
cc2.Collection = new List<MyObject>() { new MyObject() }; // PROBLEM
调用了setter,但现在我选择的项目只是一个基本的初始化类而不是null..我可以在setter中添加一些代码来检查/重置,但这并不好。