6

残念ながら何の回答も得られなかった 4 か月前の投稿を追加します。

シフトを使用してデータグリッドで複数選択を使用する場合、基本的に同じ問題の前に立っています。

巨大なリスト (グリッド内に 1,000,000 項目があり、すべてのデータが仮想化されているとします) のどこかにいて、Shift + マウス クリックを使用して 500,000 から 500,050 を選択すると、グリッドは私の "GetEnumerator()" メソッドを呼び出します。仮想リスト (Vincent と Paul のものと同様の実装)。私が今まで行っていたのは、キャッシュされたページに対する SelectMany だけでした。しかし残念なことに、行が適切に選択されませんでした (ctrl + マウス クリックでうまくいきます!)。

だから私が見つけたのは、DataGridが実際にはインデックス0から選択の最後までのすべてのアイテムを期待していることです。これは明らかに、1m アイテムのリストには理想的ではありません。これは、0 から (私の例では) 500,050 までのすべてのアイテムのリクエストが発生し、データベースからすべてをロードするためです。

したがって、私の質問は、上記のリンク先のダニエルの質問と同じです。

  • DataGrid が項目を複数回要求するのはなぜですか (選択した項目は、明らかな理由もなく連続して 6 ~ 7 回要求されます)。

  • Enumerator を使用しないように DataGrid に指示し、選択した項目だけを取得して 0 から繰り返し処理しないようにする方法はありますか?

データの仮想化に関してはあまり発見されていないため、少なくとも示唆に富む回答を得ることができれば幸いです。

4

1 に答える 1

3

私はこの問題の解決策を見つけました(少なくとも私はそれが私のために働くと言うことができます)。

私が基本的に行ったことは、次のコードを実行するようにVirtualListをだますことでした。

for (int i = 0; i < Count; i++)
{
  int pageIndex = i/PageSize;
  int pageOffset = i%PageSize;
  IList<TItem> page;
  if (pages.TryGetValue(pageIndex, out page))
  {
    yield return page[pageOffset];
  }
  yield return default(TItem);
}

そうすれば、実際にリストにあるアイテムを常に取得できますが、仮想化の一部である場合は何も返されません。

もちろん、これは他の問題を引き起こす可能性がありますが、これは私がこれに関して得た最も近いものです。

于 2013-01-16T07:50:13.883 に答える