WPF网格控件中的分页数据

WPF网格控件中的分页数据,wpf,rest,data-paging,Wpf,Rest,Data Paging,我有一个Rest服务,它以页面的形式返回数据。我知道在得到第一个结果集后有多少页数据。现在我想在WPF应用程序中使用此服务,例如在网格控件(或列表视图)中显示结果 问题在于,整个分页机制对最终用户应该是透明的,因此它们不应该通过网格中滚动以外的任何方式触发数据获取。这可能吗?您将如何解决此问题?将您的网格或列表放入ScrollViewer,订阅事件,然后使用事件参数属性确定您是否离可滚动区域的末尾足够近,并从您的服务请求下一页,最后将收到的数据添加到列表或网格的末尾 简而言之。如果你需要更具体的

我有一个Rest服务,它以页面的形式返回数据。我知道在得到第一个结果集后有多少页数据。现在我想在WPF应用程序中使用此服务,例如在网格控件(或列表视图)中显示结果


问题在于,整个分页机制对最终用户应该是透明的,因此它们不应该通过网格中滚动以外的任何方式触发数据获取。这可能吗?您将如何解决此问题?

将您的网格或列表放入ScrollViewer,订阅事件,然后使用事件参数属性确定您是否离可滚动区域的末尾足够近,并从您的服务请求下一页,最后将收到的数据添加到列表或网格的末尾

简而言之。如果你需要更具体的例子,请告诉我

编辑:好的,假设您正在使用
System.Windows.Controls.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>
当我的datagrid滚动到顶部时,我会看到以下输出:

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();
}
const int threshold=20;

如果(e.ExtentHeight,这里有另一种可能的任务解决方案:

主要思想是创建自己的IList实现,它将封装所有异步页面加载特性

作为奖励,本文包含完整的示例代码和一组附加功能:

  • 如果所有数据都存储在本地,则选择、排序和过滤工作正常
  • 根据需要在单独的线程中加载数据,而不阻塞UI
  • 加载数据时的视觉反馈;如果失败,用户可以重试上次失败的尝试

我认为这个问题很有趣,但答案对于stackoverflow窗口来说太长了,所以我构建了一个使用预取集合视图的简单应用程序

这是一种类似于伍德曼发布的方法


有趣的代码在类中:PrefetchingCollectionView

还没有尝试过它,但不知道它是否有效,因为网格已经在内部管理数据的滚动。即使使用常规WPF网格控件,也可以欣赏一个更具体的示例(我使用的是第三方控件,我将自己处理)。好的,我会做一个更具体的例子。只是澄清一下:您使用的是Grid还是DataGrid?我使用的是来自DevXPress的Grid控件,但DataGrid上的一个例子就可以了。嗯,我认为应该这样做,请给我一些时间验证:)虽然这是一个有效的解决方案,但是@Woodman提供的例子是解决这个问题的更好方法。
const int threshold = 20;
if (e.ExtentHeight <= e.VerticalOffset + e.ViewportHeight + threshold) 
{
    AskForNextPage();
}