6

使用全新发布的 RIA 服务中的业务应用程序模板,您可以看到大量使用 a 顶部的数据网格DomainDataSourceDataPager. 属性 PageSize 和 LoadSize 可用于调整要在一页中显示的数据量以及在后台预取的数据量。

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

4

3 回答 3

1

查看 Bea Stollnitz 在她的博客上所做的工作。虽然不是直接回答您的问题,但她写了很多关于 UI 和数据可视化的文章。以下是她博客中的链接,我认为这可能有助于您入门:

数据虚拟化:http ://bea.stollnitz.com/blog/?p=344


克里斯

于 2010-05-29T04:57:22.247 回答
1

这称为隐形寻呼。Component One 有一个使用 Stealth Paging 的 DataGrid 示例。向下滚动时,它会立即进入下一页。

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

显示演示,您可以下载显示代码的示例。

希望这可以帮助,

格雷格

于 2010-09-05T15:08:25.663 回答
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();
    }
}

在 XAML 中,您只需将Items属性绑定到ItemsSourcea 的属性ListBoxDataGrid

对于每个数据源,您必须实现一个 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
    }
}
于 2012-08-13T09:31:00.703 回答