使用全新发布的RIA服务中的业务应用程序模板,您可以看到许多示例使用DomainDataSource上的数据网格和DataPager.属性PageSize和LoadSize可用于调整要在一个页面中显示的数据量以及在后台预取的数据.
现在我想要一个带滚动条但没有寻呼机的数据网格.底层DomainDataSource应仅加载在网格中显示的数据.当用户向下滚动到尚未在数据上下文中的项时,它应该触发另一个加载.是否有任何示例实现如何执行此操作?
解决方法
我刚刚发布了一些博客文章(
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] 举报,一经查实,本站将立刻删除。