【问题标题】:How to implement a lazy loaded Silverlight data grid without using paging如何在不使用分页的情况下实现延迟加载的 Silverlight 数据网格
【发布时间】:2010-05-25 06:53:43
【问题描述】:

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

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

【问题讨论】:

  • 更新:既然话题回来了,我目前正在调查 3rd-party 控件。 Infragistics "VirtualCollection" 似乎是处理这个问题的最佳方式,并且可以绑定到 DomainServices - 好东西

标签: silverlight silverlight-4.0 wcf-ria-services data-virtualization


【解决方案1】:

我刚刚发布了几篇博文(Part 1Part 2),为我解决了这个问题。我还在 GitHub 上发布了a sample,它实现了我自己对 VirtualCollection 概念的看法(我不知道这与 Infragistics 的控制相比如何,因为我没有使用过)。

为了展示它的易用性,这里有一些示例中的 sn-ps。首先,这是你如何使用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 属性绑定到 ListBoxDataGridItemsSource 属性

对于每个数据源,您必须实现一个 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
    }
}

【讨论】:

  • 看起来很有希望。我一定会检查出来的。与此同时,我们认真调整了基础设施的来源以实现这一目标......
【解决方案2】:

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

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

HTH!
克里斯

【讨论】:

  • 谢谢你,克里斯,我昨天终于读到了。你完全正确,这不是直接的答案,但包含一些不错的建议。
  • 该链接已损坏,但我认为这是来自 Bea 的相同内容:zagstudio.com/blog/498#.UE8TT42PXQs
【解决方案3】:

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

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

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

希望对你有帮助,

格雷格

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多