使用全新发布的 RIA 服务中的业务应用程序模板,您可以看到大量使用 a 顶部的数据网格DomainDataSource
与DataPager
. 属性 PageSize 和 LoadSize 可用于调整要在一页中显示的数据量以及在后台预取的数据量。
现在我想要一个带有滚动条且没有寻呼机的数据网格。底层DomainDataSource
应该只加载显示在网格中的数据。当用户向下滚动到尚未在数据上下文中的项目时,它应该触发另一个加载。是否有任何示例实现如何做到这一点?
使用全新发布的 RIA 服务中的业务应用程序模板,您可以看到大量使用 a 顶部的数据网格DomainDataSource
与DataPager
. 属性 PageSize 和 LoadSize 可用于调整要在一页中显示的数据量以及在后台预取的数据量。
现在我想要一个带有滚动条且没有寻呼机的数据网格。底层DomainDataSource
应该只加载显示在网格中的数据。当用户向下滚动到尚未在数据上下文中的项目时,它应该触发另一个加载。是否有任何示例实现如何做到这一点?
查看 Bea Stollnitz 在她的博客上所做的工作。虽然不是直接回答您的问题,但她写了很多关于 UI 和数据可视化的文章。以下是她博客中的链接,我认为这可能有助于您入门:
数据虚拟化:http ://bea.stollnitz.com/blog/?p=344
!
克里斯
这称为隐形寻呼。Component One 有一个使用 Stealth Paging 的 DataGrid 示例。向下滚动时,它会立即进入下一页。
http://demo.componentone.com/Silverlight/ControlExplorer/#DataGrid/Stealth%20Paging
显示演示,您可以下载显示代码的示例。
希望这可以帮助,
格雷格
我刚刚发布了几篇博客文章(第 1部分、第 2 部分),这些文章给出了我对这个问题的解决方案。我还在 GitHub 上发布了一个示例,它实现了我自己对 VirtualCollection 概念的看法(我不知道这与 Infragistics 的控件相比如何,因为我没有使用过)。
为了展示它的易用性,下面是示例中的一些片段。首先,这里是你如何使用VirtualCollection,协调获取数据的类:
public class MainViewModel : ViewModel
{
private NetflixTitlesSource _source;
public VirtualCollection<Title> Items { get; private set; }
public MainViewModel()
{
_source = new NetflixTitlesSource();
Items = new VirtualCollection<Title>(_source, pageSize: 20, cachedPages: 5);
}
protected override void OnViewLoaded()
{
Items.Refresh();
}
}
在 XAML 中,您只需将Items
属性绑定到ItemsSource
a 的属性ListBox
或DataGrid
对于每个数据源,您必须实现一个 VirtualCollectionSource。下面是NetflixTitlesSource的两个关键方法的样子:
public class NetflixTitlesSource : VirtualCollectionSource<Title>
{
protected override Task<int> GetCount()
{
return GetQueryResults(0, 1, null)
.ContinueWith(t => (int)t.Result.TotalCount, TaskContinuationOptions.ExecuteSynchronously);
}
protected override Task<IList<Title>> GetPageAsyncOverride(int start, int pageSize, IList<SortDescription> sortDescriptions)
{
return GetQueryResults(start, pageSize, sortDescriptions)
.ContinueWith(t => (IList<Title>)((IEnumerable<Title>)t.Result).ToList(), TaskContinuationOptions.ExecuteSynchronously);
}
private Task<QueryOperationResponse<Title>> GetQueryResults(int start, int pageSize, IList<SortDescription> sortDescriptions)
{
// code to query the Netflix OData API
}
}