我刚刚发布了几篇博文(Part 1、Part 2),为我解决了这个问题。我还在 GitHub 上发布了a sample,它实现了我自己对 VirtualCollection 概念的看法(我不知道这与 Infragistics 的控制相比如何,因为我没有使用过)。
为了展示它的易用性,这里有一些示例中的 sn-ps。首先,这是你如何使用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 属性绑定到 ListBox 或 DataGrid 的 ItemsSource 属性
对于每个数据源,您必须实现一个 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
}
}