鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > WinRT/Metro > >

重新想象 Windows 8 Store Apps (54)

来源:互联网 作者:佚名 时间:2013-11-13 10:13
重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据Posted on [源码下载] 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据 作者:webabcd 介绍 重新想象 Windows 8 Store Apps 之绑定 通过实现 ISupportIncrementalLoading 接口,

重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据 Posted on

[源码下载]


重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据



作者:webabcd


介绍
重新想象 Windows 8 Store Apps 之 绑定

  • 通过实现 ISupportIncrementalLoading 接口,为 ListViewBase 的增量加载提供数据


  • 示例
    实现 ISupportIncrementalLoading 接口,以便为 ListViewBase 的增量加载提供数据
    Binding/MyIncrementalLoading.cs

    /* * 演示如何实现 ISupportIncrementalLoading 接口,以便为 ListViewBase 的增量加载提供数据 * * ISupportIncrementalLoading - 用于支持增量加载 * HasMoreItems - 是否还有更多的数据 * IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) - 异步加载指定数量的数据(增量加载) * * LoadMoreItemsResult - 增量加载的结果 * Count - 实际已加载的数据量 */ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.UI.Core; using Windows.UI.Xaml; using Windows.UI.Xaml.Data; namespace XamlDemo.Binding { public class MyIncrementalLoading<T> : ObservableCollection<T>, ISupportIncrementalLoading { _isBusy = false; // 提供数据的 Func Func<int, int, List<T>> _funcGetData; _totalCount = 0; 构造函数 MyIncrementalLoading(uint totalCount, Func<int, int, List<T>> getDataFunc) { _funcGetData = getDataFunc; _totalCount = totalCount; } 是否还有更多的数据 HasMoreItems { get { return this.Count < _totalCount; } } 异步加载数据(增量加载) IAsyncOperation<LoadMoreItemsResult> LoadMoreItemsAsync(uint count) { if (_isBusy) { ); } _isBusy = true; var dispatcher = Window.Current.Dispatcher; return AsyncInfo.Run( (token) => Task.Run<LoadMoreItemsResult>( async () => { try { Task.Delay(1000); startIndex = this.Count; await dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => { items = _funcGetData(startIndex, (int)count); foreach (var item in items) { this.Add(item); } }); LoadMoreItemsResult { Count = (uint)this.Count }; } finally { _isBusy = false; } }, token)); } } }


    演示如何实现 ListViewBase 的增量加载
    Binding/IncrementalLoading.xaml

    <Page x:Class="XamlDemo.Binding.IncrementalLoading" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:XamlDemo.Binding" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable

    Binding/IncrementalLoading.xaml.cs

    /* * 演示如何实现 ListViewBase 的增量加载 * 数据源需要实现 ISupportIncrementalLoading 接口,详见:MyIncrementalLoading.cs * * * ListViewBase - ListView 和 GridView 均继承自 ListViewBase * IncrementalLoadingTrigger - 增量加载的触发方式(IncrementalLoadingTrigger 枚举) * Edge - 允许触发增量加载,默认值 * None - 禁止触发增量加载 * DataFetchSize - 预提数据的大小,默认值 3.0 * 本例将此值设置为 4.0 ,其效果为(注:本例中的 ListView 每页可显示的数据量为 6 条或 7 条,以下计算需基于此) * 1、先获取 1 条数据,为的是尽量快地显示数据 * 2、再获取 4.0 * 1 条数据 * 3、再获取 4.0 * (6 或 7,如果 ListView 当前显示了 6 条数据则为 6,如果 ListView 当前显示了 7 条数据则为 7) 条数据 * 4、以后每次到达阈值后,均增量加载 4.0 * (6 或 7,如果 ListView 当前显示了 6 条数据则为 6,如果 ListView 当前显示了 7 条数据则为 7) 条数据 * IncrementalLoadingThreshold - 阈值,默认值 0.0 * 本例将此值设置为 2.0 ,其效果为(注:本例中的 ListView 每页可显示的数据量为 6 条或 7 条) * 1、滚动中,如果已准备好的数据少于 2.0 * (6 或 7,如果 ListView 当前显示了 6 条数据则为 6,如果 ListView 当前显示了 7 条数据则为 7) 条数据,则开始增量加载 */ using Windows.UI.Xaml.Controls; using XamlDemo.Model; using System.Linq; using System.Collections.Specialized; using System; namespace XamlDemo.Binding { IncrementalLoading : Page { MyIncrementalLoading<Employee> _employees; public IncrementalLoading() { this.InitializeComponent(); this.Loaded += IncrementalLoading_Loaded; } void IncrementalLoading_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e) { listView.IncrementalLoadingTrigger = IncrementalLoadingTrigger.Edge; listView.DataFetchSize = 4.0; listView.IncrementalLoadingThreshold = 2.0; _employees = new MyIncrementalLoading<Employee>(1000, (startIndex, count) => { lblLog.Text += , startIndex, count); lblLog.Text += Environment.NewLine; return TestData.GetEmployees().Skip(startIndex).Take(count).ToList(); }); _employees.CollectionChanged += _employees_CollectionChanged; listView.ItemsSource = _employees; } void _employees_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { lblMsg.Text = + _employees.Count.ToString(); } } }



    OK
    [源码下载]

    网友评论
    <