データベースからlinq-to-sqlによって入力されたリストにバインドされたWPFデータグリッドがあります。バインディングは双方向であり、ユーザーは各行の値を変更できます
<wpf:DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding MyList}"
SelectedItem="{Binding SelectedItem}" >
約 20000 行を表示すると、リストの初期化中にメモリ不足の例外でプログラムがクラッシュします。行数が少なくても、パフォーマンスが耐えられないほど遅くなります。
初期化時に、データグリッドが各行を反復処理して、最大列幅とその他のプロパティを測定することを知っています。画面上にあるかどうかに関係なく、すべての行に対して明らかにそうします。
myQuery.ToList()
データグリッドをバインドする(列をクリックしてデータグリッドをソートできるようにする) か、IQueryable に直接バインドしようとしました。(並べ替えはそれでは機能しません)
どちらも同じ結果になります。20000 個の項目を持つ ToList() だけでは、大量のメモリが消費されることはありません。これは、 datagrid にバインドされている場合にのみ発生します。
データグリッド内の 20000 行がどれほど有用であるかという問題を無視します (これらは現在の要件です。これらを変更するには、実際の例が役立ちます)。
現在画面に表示されているデータのみを遅延ロードし、スクロールして表示されるまで他のすべてを無視する最も簡単な方法は何ですか?
これは、サードパーティのライブラリや主要なコード変更なしで実行できますか?
そうでない場合、推奨される回避策は何ですか?