我正在使用標準wpf/mvvm應用程序,其中將組合框綁定到ViewModel上的集合。取消選擇MVVM中的ComboBoxItems
我需要能夠從下拉菜單中取消選擇一個項目。意思是說,用戶應該能夠選擇一些東西,然後決定他們想取消選擇它(不選擇)。問題是在我的綁定集合中沒有空元素
我最初的想法只是在集合中插入一個新項目,這會導致在集合頂部有一個空項目。
雖然這是一種黑客行爲,但它會影響在視圖模型上使用該集合的所有代碼。
例如,如果有人在寫
_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
設置器調用,但現在我的選擇的產品只是一個基本的初始化類,而不是空..我可以在二傳手添加一些代碼檢查/重置,但這並不好。
你可以讓通過單擊文本菜單一個菜單項,用戶去選擇一個項目的優勢。 –
右鍵點擊下拉菜單?這並不夠直觀.. –
我可以忍受這一點。^^ Combobox甚至不會打開,如果你右鍵點擊它,所以它不會是用戶不友好的。 –