如何在不使用分页的情况下实现延迟加载的Silverlight数据网格

Mar*_*tke 6 silverlight silverlight-4.0 wcf-ria-services data-virtualization

使用全新发布的RIA服务中的业务应用程序模板,您可以看到许多示例使用数据网格DomainDataSource与a结合使用DataPager.属性PageSize和LoadSize可用于调整要在一个页面中显示的数据量以及在后台预取的数据.

现在我想要一个带滚动条但没有寻呼机的数据网格.底层DomainDataSource应该只加载在网格中显示的数据.当用户向下滚动到尚未在数据上下文中的项时,它应该触发另一个加载.是否有任何示例实现如何执行此操作?

Sam*_*ack 1

我刚刚发布了几篇博客文章(第 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在 XAML 中,您只需将Items属性绑定到ItemsSourceaListBox或的属性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
    }
}
Run Code Online (Sandbox Code Playgroud)