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

时间:2010-05-25 06:53:44

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

HTH!
克里斯

答案 1 :(得分:1)

它被称为隐形传呼。 Component One有一个使用Stealth Paging的DataGrid示例。一旦向下滚动,它就会显示下一页。

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

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

希望这有帮助,

格雷格

答案 2 :(得分:1)

我刚刚发布了几篇博客文章(Part 1Part 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属性绑定到ItemsSourceListBox

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
    }
}