Я только что опубликовал пару постов в блоге ( Часть 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
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
}
}