0

データをページ単位で返すRestサービスがあります。最初の結果セットを取得した後、データのページ数がわかります。ここで、このサービスをWPFアプリケーションで使用したいと思います。たとえば、結果をグリッドコントロール(またはリストビュー)に表示します。

問題は、ページングメカニズム全体がエンドユーザーに対して透過的である必要があるため、グリッド内でのスクロール以外の方法でデータフェッチをトリガーしてはならないことです。これは可能ですか?この問題にどのように取り組みますか?

4

3 に答える 3

1

タスクの別の可能な解決策は次のとおりです。http ://www.devzest.com/blog/post/wpf-data-virtualization.aspx

主なアイデアは、すべての非同期ページ読み込み機能をカプセル化するIListの独自の実装を作成することです。

ボーナスとして、その記事には一連の追加機能を備えた完全なサンプルコードが含まれています。

  • 選択、並べ替え、フィルタリングは、すべてのデータがローカルに保存されている場合と同様に機能します。
  • UIをブロックせずに、必要に応じて別のスレッドでデータをロードします。
  • データの読み込み中の視覚的なフィードバック。失敗した場合、ユーザーは最後に失敗した試行を再試行できます。
于 2013-02-20T18:27:17.020 に答える
0

グリッドまたはリストを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();
}

もちろん、ここにはいくつかのニュアンスがあります。データの重複やその他の不整合を回避するために、すでにいくつかのページをダウンロードしているかどうか、およびすでにロードしたページ数を追跡する必要があります。そして、正直に言うと、これは私がここに書いたものと比較して、行うのが最も難しい部分になります。:)

于 2013-02-14T22:08:37.180 に答える
0

問題は面白いと思いましたが、答えはスタックオーバーフローウィンドウには長すぎるので、プリフェッチコレクションビューを使用するシンプルなアプリを作成しました。

これは、ウッドマンが投稿したものと似たようなアプローチです。

https://github.com/mrange/CodeStack/tree/master/q14793759/AutoFetching

興味深いコードはクラスにあります:PrefetchingCollectionView

于 2013-02-20T19:50:20.720 に答える