2011-09-28 13 views
3

リストボックスには、バッキングデータを持つアイテムが多数存在する可能性があります。データの仮想化を処理するために、私はObservableCollectionと同じインターフェースを実装したコレクションを書くことによってWPFのUI仮想化に結びつけ、必要に応じてバッキングデータをスピンアップできます。リストボックスのデータバーチャライゼーションとマルチセレクト

これは問題なく動作します。問題は、リストボックスで複数選択を導入したときに発生します。リストボックスはインデックス(SelectedItems)ではなくオブジェクトによって選択されたアイテムを管理するため、すべてのアイテムを選択すると、リストボックスによってバッキングデータがすべてスピンアップされ、メモリに保持され、データ仮想化が破棄されます...

オブジェクトの代わりにインデックスによる選択を管理するためにListBoxを書き直す以外のことが起きないようにする方法?

ありがとうございます!

Eric

+0

アイテムが必要に応じてロードされるようにしたいので、あなたが望むものを正確に得たように思えます。 「すべて選択」するには、それらをロードする必要があります。 TBHでは、リストボックスのCTRL-A(すべて選択)を無効にして、何もしないコマンド(基本的に無効にする)に結び付けます。バインドでこれを行うことができるか、リストボックスのサブクラスを派生させる必要があるかどうかはわかりません。 –

+0

私は、実際に表示されているアイテムにデータが読み込まれるようにしたいだけですが、項目がオフスクリーンであってもリストボックスが選択されたインデックスリストを維持して、ユーザーがctrl-aを使用できるようにするには、すべてのアイテムを選択するのを止めたくありません。 – esc861

+0

残念ながら、私は右にポストするコードにアクセスしませんが、私は同様の状況を抱えていたし、ListViewに移動しました(しかし、私はあなたがListBoxでそれを行うことができると思います)。その方法では、アイテムレベルでチェック(選択)を処理しており、ListBoxで選択したアイテムのコレクションを管理する必要はありません。私は、Checkイベントをよりうまくコントロールするためにこれを行いましたが、仮想化でもうまく動作すると思います。 LostFocusイベントと同様にUpdateSourceTrigger = PropertyChangedを使用すると、ListItemの問題が発生する可能性があります。 – Paparazzi

答えて

0

私たちは、データの仮想化を制御するためのUIの仮想化を使用していたが、私たちのデータがアンロードされていなかったので、選択を握っリストボックスで問題が発生してました。

私がやったことは、仮想化スタックパネルのアイテムジェネレータと結びつけて、生成されたコンテナのデータコンテキスト変更イベントをリスンすることでした。これが起こったとき、私はラッパーから実際のデータをアンロードしました。

0

UIコントロールで[仮想化]オプションを使用しないのはなぜですか。これにより、画面に表示されるデータのみがロードされます。

http://www.kirupa.com/net/ui_virtualization_pg1.htm

+0

このアプローチは、多くのエントリ、たとえば70Kを複数選択することができますか? – Wolf

+0

私は、なぜ、UIが一度にその多くのエントリを選択したいのかはわかりません。しかし、なぜそれができないのか分かりません。エントリを手動でUIから選択するか(永遠にとるか)、またはコード・コールで行います。仮想化は、コントロール自体の表示ではなく、メモリ内のデータのバックアップではなく、画面上のコントロールの表示にのみ適用されます。 – tsells

+0

さて、私は100万アイテム(データのテキストとして単にインデックスを使用する)でそれを試しました。すべてを選択([Home]→[Shift] [Ctrl] [End])はかなり速く動作します。ところで、私はログファイルの内容を表示するために、仮想化されたリストボックスを使用します。今、ユーザは、その一部をクリップボードにコピーできるはずです。 – Wolf

関連する問題