Как реализовать ленивую загруженную сетку данных 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

Другие вопросы по тегам