2011-06-23 9 views
0

でコンボボックスのデータのフィルタの「すべて」の値は、私はいくつかのデータとのコンボボックスを移入します。正常に動作します。私はdisplayPathとしてStatusPathとStatusPathをStatusPathとして持っています。は、ユーザーコントロールの構築時にはWPF

cmb.ItemsSource = dbEntities.Status 

comoboxは、フィルタコントロールとして使用され、私は、空のフィルタとして使用される、「すべて」のためのいくつかの値を挿入する必要があります。

ObjectSet objectSet= dbEntities.Status; 
Status stAll = new Status(); 
stAll.ID = -1; 
stAll.Name = "All"; 
objectSet.AddObject(stAll); 
cmb.ItemsSource = objectSet; 

オブジェクトがobjectSetとに追加されていないいくつかの理由:

は、最初に私は面白い解決策を試してみました。それはいずれの例外もスローしませんでした。

次に、手動で最初のインデックスに挿入しようとしましたが、エラーが発生しました: "ItemsSourceが使用されている間は操作は無効です。代わりにItemsControl.ItemsSourceで要素にアクセスして変更してください。

cmb.ItemsSource = entities.Status; 
cmb.Items.Insert(0,"All"); 

どちらのdidntの仕事: 私のコードは次のように見えました。その行をコンボボックスに追加する最も簡単な方法は何ですか?エラーメッセージは私を混乱させました。私はそのような目的のためにItemsSourceをどのように使用するのか分かりません。

編集:私はので、ここで自分の質問に答えるために十分な担当者が作業コードである必要はありませんでした。 Craigに感謝します。

CompositeCollection comp = new CompositeCollection(); 
comp.Add(new CollectionContainer {Collection = dbEntities.Status}); 
Status stAll = new Status(); 
stAll.ID = -1; 
stAll.Name = "All"; 
comp.add(stAll); 
cmb.ItemsSource = comp; 
//do whatever filter you want when the selected value is -1 

答えて

1

何をしようとしているかにいくつかの問題があります。あなたがItemsSourceに設定されているオブジェクトを介して行かなければならない代わりに、ItemsSourceを使用しているときは、Itemsを操作することはできません。これは、第2の部分のエラーメッセージの内容です。あなたがItemsSourceを設定するとItems値が使用されていないので、そのことはItemsSourceの値が取り込まれていません。

私は最初のケースが動作していない理由を知ってObjectSetクラスで十分慣れていませんよ。しかし、あなたが他の場所から引っ張ってきた値にアイテムを追加するのは難しいようです。よりよい解決策は、何も表さないためにヌル値を使用することです。残念ながら、WPFでこれを行う方法はありません。しかし、これを行うアダプタを使用するのはかなり簡単な解決策があります。私はthis solution a NullItemSelectorAdaptorを使用しました。これは、nullがリストに含まれていなくても選択としてnullを有効にします。あなたがしなければならないのは、NullItemSelectorAdapterにあなたのコンボボックスをラップすることです。ヌルは値として追加されます。ブログ記事はすべてをきれいに説明しているので、私はそれを繰り返さない。あなたがフィルタリングをしないことにヌルが等しいようにあなたのフィルタをセットアップすることができます。

+0

あなたのリンクは、この解決策を考え出す助けになりました。 'CompositeCollection comp = new CompositeCollection(); 'comp.Add(新しいCollectionContainer {Collection = dbEntities.Status});' 'ステータスstAll =新しいステータス();' 'stAll.ID = -1;' 'stAll.Name = "すべて";' 'comp.add(stAll);' 'cmb.ItemsSource = comp;' コンポジットコレクションクラスを使用して、「すべて」を示す項目を手動で追加できます。 selectedItemプロパティはnullを返しませんが、selectedValueは-1であり、私の解決に必要で十分です。 (なぜ私はそれがObjectSetで動作しないのか分かりません) – Kta

関連する問題