微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

解决方法

我刚刚发布了一些博客文章( Part 1,Part 2),为我提供了解决这个问题的方法.我还向GitHub发布了 a sample,它实现了我自己对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属性绑定到ListBox或DataGrid的ItemsSource属性

对于每个数据源,您必须实现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,IList<SortDescription> sortDescriptions)
    {
        // code to query the Netflix OData API
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐