データをページ単位で返すRestサービスがあります。最初の結果セットを取得した後、データのページ数がわかります。ここで、このサービスをWPFアプリケーションで使用したいと思います。たとえば、結果をグリッドコントロール(またはリストビュー)に表示します。
問題は、ページングメカニズム全体がエンドユーザーに対して透過的である必要があるため、グリッド内でのスクロール以外の方法でデータフェッチをトリガーしてはならないことです。これは可能ですか?この問題にどのように取り組みますか?
データをページ単位で返すRestサービスがあります。最初の結果セットを取得した後、データのページ数がわかります。ここで、このサービスをWPFアプリケーションで使用したいと思います。たとえば、結果をグリッドコントロール(またはリストビュー)に表示します。
問題は、ページングメカニズム全体がエンドユーザーに対して透過的である必要があるため、グリッド内でのスクロール以外の方法でデータフェッチをトリガーしてはならないことです。これは可能ですか?この問題にどのように取り組みますか?
タスクの別の可能な解決策は次のとおりです。http ://www.devzest.com/blog/post/wpf-data-virtualization.aspx
主なアイデアは、すべての非同期ページ読み込み機能をカプセル化するIListの独自の実装を作成することです。
ボーナスとして、その記事には一連の追加機能を備えた完全なサンプルコードが含まれています。
- 選択、並べ替え、フィルタリングは、すべてのデータがローカルに保存されている場合と同様に機能します。
- UIをブロックせずに、必要に応じて別のスレッドでデータをロードします。
- データの読み込み中の視覚的なフィードバック。失敗した場合、ユーザーは最後に失敗した試行を再試行できます。
グリッドまたはリストをScrollViewerに配置し、ScrollChangedイベントをサブスクライブしてから、event argsプロパティを使用して、スクロール可能な領域の終わりに十分近いかどうかを判断し、サービスに次のページを要求し、最後に受信したデータを最後に追加しますリストまたはグリッドの。
要するに。より具体的な例が必要な場合は、お知らせください。
編集:さて、あなたがSystem.Windows.Controls.DataGrid
あなたのデータを表示するためにコントロールを使用していると仮定します。グリッドにはスクロール機能が組み込まれているとおっしゃっていたので、この仮定を立てています。グリッドに似た名前のコントロールにはスクロール機能がありません。また、データ表示にDataGridを使用することは理にかなっているためです。:)
次のようにDataGridを宣言します。
<DataGrid HorizontalAlignment="Left" Margin="20,10,0,0"
VerticalAlignment="Top" Height="301" Width="498"
ScrollViewer.ScrollChanged="DataGrid_ScrollChanged_1"
ItemsSource="{x:Static Fonts.SystemFontFamilies}">
</DataGrid>
ScrollViewer.ScrollChanged
ルーティングされたイベントを使用していることに注意してください。これが可能なのは、DataGridに実際にScrollViewerが組み込まれているためです。これは、そのイベントをサブスクライブして、その引数を分析できることを意味します。
テスト目的でこのイベントを処理する方法は次のとおりです。
private void DataGrid_ScrollChanged_1(object sender, ScrollChangedEventArgs e)
{
Debug.WriteLine("Extent height: " + e.ExtentHeight +
", vertical offset: " + e.VerticalOffset +
", viewport height: " + e.ViewportHeight);
}
データグリッドを上にスクロールすると、次の出力が表示されます。
Extent height: 267, vertical offset: 0, viewport height: 13
一番下までスクロールすると:
Extent height: 267, vertical offset: 254, viewport height: 13
したがって、いつ底に近づいたかを判断し、それに応じて行動するのは非常に簡単です。
const int threshold = 20;
if (e.ExtentHeight <= e.VerticalOffset + e.ViewportHeight + threshold)
{
AskForNextPage();
}
もちろん、ここにはいくつかのニュアンスがあります。データの重複やその他の不整合を回避するために、すでにいくつかのページをダウンロードしているかどうか、およびすでにロードしたページ数を追跡する必要があります。そして、正直に言うと、これは私がここに書いたものと比較して、行うのが最も難しい部分になります。:)
問題は面白いと思いましたが、答えはスタックオーバーフローウィンドウには長すぎるので、プリフェッチコレクションビューを使用するシンプルなアプリを作成しました。
これは、ウッドマンが投稿したものと似たようなアプローチです。
https://github.com/mrange/CodeStack/tree/master/q14793759/AutoFetching
興味深いコードはクラスにあります:PrefetchingCollectionView