リストボックスには、バッキングデータを持つアイテムが多数存在する可能性があります。データの仮想化を処理するために、私はObservableCollectionと同じインターフェースを実装したコレクションを書くことによってWPFのUI仮想化に結びつけ、必要に応じてバッキングデータをスピンアップできます。リストボックスのデータバーチャライゼーションとマルチセレクト
これは問題なく動作します。問題は、リストボックスで複数選択を導入したときに発生します。リストボックスはインデックス(SelectedItems)ではなくオブジェクトによって選択されたアイテムを管理するため、すべてのアイテムを選択すると、リストボックスによってバッキングデータがすべてスピンアップされ、メモリに保持され、データ仮想化が破棄されます...
オブジェクトの代わりにインデックスによる選択を管理するためにListBoxを書き直す以外のことが起きないようにする方法?
ありがとうございます!
Eric
アイテムが必要に応じてロードされるようにしたいので、あなたが望むものを正確に得たように思えます。 「すべて選択」するには、それらをロードする必要があります。 TBHでは、リストボックスのCTRL-A(すべて選択)を無効にして、何もしないコマンド(基本的に無効にする)に結び付けます。バインドでこれを行うことができるか、リストボックスのサブクラスを派生させる必要があるかどうかはわかりません。 –
私は、実際に表示されているアイテムにデータが読み込まれるようにしたいだけですが、項目がオフスクリーンであってもリストボックスが選択されたインデックスリストを維持して、ユーザーがctrl-aを使用できるようにするには、すべてのアイテムを選択するのを止めたくありません。 – esc861
残念ながら、私は右にポストするコードにアクセスしませんが、私は同様の状況を抱えていたし、ListViewに移動しました(しかし、私はあなたがListBoxでそれを行うことができると思います)。その方法では、アイテムレベルでチェック(選択)を処理しており、ListBoxで選択したアイテムのコレクションを管理する必要はありません。私は、Checkイベントをよりうまくコントロールするためにこれを行いましたが、仮想化でもうまく動作すると思います。 LostFocusイベントと同様にUpdateSourceTrigger = PropertyChangedを使用すると、ListItemの問題が発生する可能性があります。 – Paparazzi