この問題の解決策を示すブログ投稿 (パート 1、パート 2 ) をいくつか公開しました。また、VirtualCollection の概念に対する独自の解釈を実装したサンプルを GitHub に投稿しました (使用したことがないため、これが 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
バインドするだけListBox
です。DataGrid
データ ソースごとに、VirtualCollectionSource を実装する必要があります。NetflixTitlesSourceの 2 つの主要なメソッドは次のようになります。
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
}
}