2013-08-14 5 views
7

を変更します。WPF:コンボボックスがバインドされたItemSource収集した後、選択したインデックスを失うことは、私はGoogleに検索したし、ここで答えを、私の問題は、以下の質問に多少関連しますが、新しい質問を保証するのに十分な異なる

Combo-box loses selection after collection changes

基本的に、私はのObservableCollectionクラスにバインドされたWPFのコンボボックスを持っています。このクラスには、データベースの新しいスナップショットを取得するためのクリアやリフィルなど、いくつかの変更を行う必要がある場合、コレクションの変更通知を遅らせる追加の機能があります。

私のコンボボックスのバインディングには、DisplayMemberPathとSelectedValuePathの両方が設定されています。 SelectedValuePathは整数プロパティに解決されます。

問題は、参照質問、私はバインドされたコレクション内の値を更新すると、バウンドコンボボックスはその選択を失い、そして(SelectedIndexを= -1)ブランクになると同じです。

私はて、CollectionChangedイベントは、コレクションが再投入されるまで焼成し、バックその中のアイテムを持っていませんことを確認することができます。

もっと不可解な、私は次の操作を行う場合は次のとおりです。

 using (_collection.DelayNotifications()) 
     { 
      var items = _collection.ToArray(); 
      _collection.Clear(); 
      _collection.AddRange(items); 
     } 

コンボボックスがないは、その選択された値を失いません。

これは、コレクション内のアイテムがデータベースから取得された新しいアイテムで置き換えられた場合に破損することを示唆しています - SelectedValuePathバインディングを使用していない場合でも受け入れることができます。同じ、確かに私がやっていることはうまくいくはずですか?

私は誰もが任意のアイデアを持って、.NET 3.5 SP1

を使用していますか?

編集以下のコメントから

とBLAMの答え。私はそれらが理由であることを承諾するなぜそれをやっている。しかし、それは本当に私を助けません。

私は、ビューモデルのIntegerプロパティにComboboxのSelectedValueプロパティをバインドしています。 SelectedItemをバインドする場合、ビューモデルでそのオブジェクトタイプのプロパティにバインドする必要がありますが、実際にはそれは整数プロパティです。私は「固定」しまし瞬間

にバインドされているプロパティ「SelectedValueの」のプロパティ変更イベントを強制することにより、問題を(マイナーなハックを読みます)。これは、定義されたSelectedValuePathに一致する項目の内部リストをComboboxに再チェックさせるようです。 WPFコンボボックスは、「知っている」必要があります

は、それゆえ私はそれがそのアイテムのマッチングロジックを調整するだろうと仮定し、その遠く飛躍のとは思わない、SelectedValuePath値が設定されています。しかし、これはSOが意図している範囲外です。

私はおそらくこれを受け入れるつもりであることを理解していますが、これはWPFの仕組みですが、WinFormsのデータバインドされたコンボボックスと数年戦った後、WPFを使う必要はありません。 WPFコンボボックスはWinFormよりはるかに優れていると言っていますが。

+0

ValuePathは別のオブジェクトであれば問題ありません...特定のインシュランス(オブジェクト)にバインドされているため、バインディングが保持されることは期待できません。それらを削除すると、バインディングは失われます。 – UIlrvnd

+0

DelayNotificatons()によって返されたオブジェクトの処理方法は、ListResetフラグを指定してCollectionChangeイベントを発生させます。私はまだコンボボックスを見て、それが一致する整数値の新しいリストを見ていると思います...もし何が起こっていなければ、私のオプションは何ですか? – Marlon

+0

コード例では、操作するのはコレクションだけなので、同じインスタンスを使用します。 **同じ値を持っていても整数が別のインスタンスであるので見えません...それが意味を持つことを願っています... – UIlrvnd

答えて

4

この文は、

間違っている私は私が結合SelectedValuePathを使用していなかった場合は、これを受け入れる が、私は

だからあなたはSelectedValuePathに結合ないある可能性があります。
オブジェクトのコレクションにバインドしています。
SelectedValuePathは、レポートのためだけに使用され、オブジェクトを比較することとは何の関係もありません。 DisplayMemberPathは、レポートのためだけのもので、オブジェクトの同等性を比較することとは関係ありません。

SelectValuePathとSelectedItemを混同します。
ComboBoxは、SelectedValuePathを使用して2つのオブジェクトが等しいかどうかを判断しません。 SelectedValuePathのドキュメントから

が のSelectedItemからSelectedValueのを取得するために使用されているパスを取得または設定します。あなたが後ろに同じオブジェクトをロードしている混乱サンプルで

私はSelectedValuePathはあなたがはっきりとIDを持つオブジェクトを再作成する場合はID

というプロパティであると仮定するつもりです6のIDを持つクリアされたオブジェクトと同じではありません。

これを試してください。 IDが6の2つのオブジェクト(o1とo2)を作成し、o1.Equals(o2)を比較します。

IDが6の2つのオブジェクトを等しくするには、GetHashCodeとEqualsを上書きする必要があります。 Equalsでは、IDが6であればtrueを返し、IDはGetHashCodeとして使用できます。

文字列はあなたを欺くための参照型です。
文字列s1 = "cat";
文字列s2 = "cat";
s1.Equals(s2)は、String Equalsが値を比較するためにオーバーライドされるときにtrueを返します。

+0

私はそれを理解していますが、 SelectedItemにバインドされていない、SelectedValueにバインドしています。したがって、ComboBoxがSelectedItemの等価性を比較するとは思わないでしょう。私はそれが本当に誰かにバインドされているプロパティを決定することはできませんとスイートに内部ロジックを調整すると思います。 – Marlon

+0

Stefenの答えとコメントでは、SelectedValueにバインドしていません。オブジェクトのコレクションにバインドしています。 DisplayMemberPathとSelectedValuePathはレポートのためのものです。これが答えです。それを適用するのではなく、なぜそれを拒否しますか? – Paparazzi

+0

私はそれを拒否していません - 私は単に私がやっていることを説明するだけです。私の論理は根拠がないとは思わない。私の質問への編集を参照してください。私はそれを数日与えるつもりですが、私はおそらくあなたの答えを受け入れるつもりです。 – Marlon

関連する問題