Как реализовать ленивую загруженную сетку данных Silverlight без использования подкачки - PullRequest
6 голосов
/ 25 мая 2010

Используя шаблон бизнес-приложения из новой выпущенной службы RIA, вы можете увидеть множество примеров использования сетки данных поверх DomainDataSource в сочетании с DataPager. Свойства PageSize и LoadSize можно использовать для настройки объема данных, отображаемых на одной странице, и данных, которые предварительно выбираются в фоновом режиме.

Теперь я хотел бы иметь сетку данных с полосой прокрутки и без пейджера. Базовый DomainDataSource должен загружать только те данные, которые отображаются в сетке. Это должно вызвать другую загрузку, когда пользователь прокручивает вниз до элементов, которые еще не находятся в контексте данных. Есть ли пример реализации, как это сделать?

Ответы [ 3 ]

1 голос
/ 05 сентября 2010

Это называется стелс-пейджингом. У первого компонента есть образец их DataGrid, который использует Stealth Paging. Как только вы прокрутите страницу вниз, появится следующая страница.

http://demo.componentone.com/Silverlight/ControlExplorer/#DataGrid/Stealth%20Paging

Показывает демоверсию, и вы можете скачать образец, который показывает код.

Надеюсь, это поможет,

Грег

1 голос
/ 13 августа 2012

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

Проверьте работу, которую проделала Беа Штольниц, в своем блоге. Хотя это и не прямой ответ на ваш вопрос, она довольно много написала о пользовательском интерфейсе и визуализации данных. Вот ссылка из ее блога, которая, я думаю, может помочь вам начать:

Виртуализация данных: http://bea.stollnitz.com/blog/?p=344

НТН!
Chris

...