7

私はGoogleを検索しましたが、ここで回答を求めました.私の問題は以下の質問に多少関連していますが、新しい質問を正当化するのに十分なほど異なっています.

コレクションの変更後にコンボボックスの選択が失われる

基本的に、ObservableCollection クラスにバインドされた WPF コンボボックスがあります。このクラスには、データベースの新しいスナップショットを取得するためのクリアと再入力など、コレクションに多くの変更を加える必要がある場合に、コレクションの変更通知を遅らせる追加機能があります。

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

問題は参照された質問と同じです。バインドされたコレクションの値を更新すると、バインドされた ComboBox が選択を失い、空白になります (SelectedIndex = -1)。

CollectionChanged イベントは、コレクションが再設定され、アイテムがコレクション内に戻されるまで発生しないことを確認できます。

さらに不可解なのは、次のことを行う場合です。

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

コンボボックスは、選択した値を失いません。

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

.NET 3.5 SP1 を使用しています

誰でもアイデアはありますか?

編集

以下のコメントとBlamの回答から。それらがそれを行う理由であることを私は受け入れます。しかし、それは本当に私を助けません。

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

現時点では、「SelectedValue」がバインドされているプロパティのプロパティ変更イベントを強制することにより、問題を「修正」しました(マイナーハックを読んでください)。これにより、定義された SelectedValuePath に一致するアイテムの内部リストを Combobox が再チェックするようです。

WPF Combobox は、SelectedValuePath 値が設定されていることを「認識」する必要があるため、アイテム マッチング ロジックを調整すると想定するのはそれほど大きな飛躍ではないと思います。ただし、これは SO の対象範囲外です。

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

4

1 に答える 1