標準のwpf/mvvmアプリケーションを使用しています。ここでコンボボックスをViewModelのコレクションにバインドします。MVVMのComboBoxItemの選択解除
ドロップダウンからアイテムを選択解除できる必要があります。つまり、ユーザーは何かを選択し、後でそのユーザーの選択を解除する(選択しない)ことができます。問題は、私のバインドされたコレクションに空の要素がないことです。
私の最初の考えは、単にコレクションの上に空のアイテムを持つ新しいアイテムをコレクションに挿入することでした。
これはハックですが、ビューモデルでそのコレクションを使用するすべてのコードに影響します。例えば
誰かが、これはnull参照の例外がスローされます
_myCollection.Frist(o => o.Name == "foo")
を書くことだった場合。
可能な回避策は次のとおりです。
_myCollection.Where(o => o != null).First(o => o.Name == "foo");
これは動作しますが、そのコレクションの任意の将来の使用を確保する方法は任意のブレークを起こさないことはありません。
空のアイテムを追加できるようにするための良いパターン/解決策は、ユーザーが選択を解除できるようにすることです。 (私もCollectionView構造を認識していますが、それはそう単純なもののためにやり過ぎのように思える)
更新
(コンセプトの迅速な証拠)
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;
}
}
を@hbarck提案して行き、CompositeCollectionを実装
このコードは、既存のバインディング(SelectedItemを含む)でうまく動作します。
この問題の1つは、アイテムが完全にnullの場合は、を選択してもSelectedItemセッターが呼び出されないことです。
私はこれまで1行ことを変更した場合:
cc2.Collection = new List<MyObject>() { new MyObject() }; // PROBLEM
はセッターが呼ばれ、今は私の選択した項目ではなくヌルだけの基本的な初期化クラスです..私はにセッターにいくつかのコードを追加することができますチェック/リセット、それは良くありません。
あなたのviewmodelsをしていないことの利点は、任意のより複雑持っています。 –
ドロップダウンを右クリックしますか?それは直感的ではありません。 –
私はそれで生きることができます。^^コンボボックスはあなたが右クリックすれば開いてもいないので、その人には不愉快です。 –