Mar*_*tke 6 silverlight silverlight-4.0 wcf-ria-services data-virtualization
使用全新发布的RIA服务中的业务应用程序模板,您可以看到许多示例使用数据网格DomainDataSource与a结合使用DataPager.属性PageSize和LoadSize可用于调整要在一个页面中显示的数据量以及在后台预取的数据.
现在我想要一个带滚动条但没有寻呼机的数据网格.底层DomainDataSource应该只加载在网格中显示的数据.当用户向下滚动到尚未在数据上下文中的项时,它应该触发另一个加载.是否有任何示例实现如何执行此操作?
我刚刚发布了几篇博客文章(第 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)
| 归档时间: |
|
| 查看次数: |
3191 次 |
| 最近记录: |