Как реализовать ленивую загруженную сетку данных Silverlight без использования подкачки
Используя шаблон бизнес-приложения из недавно выпущенных сервисов RIA, вы можете увидеть множество примеров использования сетки данных поверх DomainDataSource
в сочетании с DataPager
, Свойства PageSize и LoadSize можно использовать для настройки объема данных, отображаемых на одной странице, и данных, которые предварительно выбираются в фоновом режиме.
Теперь я хотел бы иметь сетку данных с полосой прокрутки и без пейджера. Основной DomainDataSource
следует загружать только те данные, которые отображаются в сетке. Это должно вызвать другую загрузку, когда пользователь прокручивает вниз до элементов, которые еще не находятся в контексте данных. Есть ли пример реализации, как это сделать?
3 ответа
Я только что опубликовал пару постов в блоге ( часть 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
}
}
Проверьте работу, которую проделала Bea Stollnitz в своем блоге. Хотя это и не прямой ответ на ваш вопрос, она довольно много написала о пользовательском интерфейсе и визуализации данных. Вот ссылка из ее блога, которая, я думаю, может помочь вам начать:
Виртуализация данных: http://bea.stollnitz.com/blog/?p=344
НТН!
Крис
Это называется стелс-пейджингом. У первого компонента есть образец их DataGrid, который использует Stealth Paging. Как только вы прокрутите страницу вниз, появится следующая страница.
http://demo.componentone.com/Silverlight/ControlExplorer/
Показывает демо, и вы можете скачать образец, который показывает код.
Надеюсь это поможет,
Greg