Silverlight/iSupport增量集合加载增量集合加载

Silverlight/iSupport增量集合加载增量集合加载,silverlight,Silverlight,你知道像wpf这样的增量集合加载的替代方法是支持增量集合加载吗?我看没有任何答案;( 因此,我将在这里发布我的实现。 图书馆仍然是测试版,如果您有任何问题,请询问并发送您的问题 /// P.Zh. public class IncrementalLoadingCollection<T, TT> : ObservableCollection<TT>, ISupportIncrementalLoading where T : IIncrementalSourc

你知道像wpf这样的增量集合加载的替代方法是支持增量集合加载吗?

我看没有任何答案;( 因此,我将在这里发布我的实现。 图书馆仍然是测试版,如果您有任何问题,请询问并发送您的问题

  /// P.Zh. 
public class IncrementalLoadingCollection<T, TT> : ObservableCollection<TT>, ISupportIncrementalLoading
     where T : IIncrementalSource<TT>, new()
    {
        private T source;
        private int itemsPerPage;
        private bool hasMoreItems;
        private int currentPage;

        public IncrementalLoadingCollection(int itemsPerPage = 20)
        {
            this.source = new T();
            this.itemsPerPage = itemsPerPage;
            this.hasMoreItems = true;
        }

        public bool HasMoreItems
        {
            get { return hasMoreItems; }
        }

        public async Task<LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
        {
            var task = Task.Factory.StartNew(async () =>
            {
                uint resultCount = 0;
                var result = await source.GetPagedItems(null, currentPage++, itemsPerPage);
                if (result == null || result.Count() == 0)
                {
                    hasMoreItems = false;
                }
                else
                {
                    resultCount = (uint)result.Count();
                    Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        foreach (TT item in result)
                            this.Add(item);
                    });
                }
                return new LoadMoreItemsResult() { Count = resultCount };
            }
            // ,CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default            
            ).Unwrap();           
            return task.Result;
        }       
    }

    public interface IIncrementalSource<T>
    {
        /// <summary>
        /// Get Chunk of data in specific interval from a colection
        /// </summary>
        /// <param name="o">custome object</param>
        /// <param name="pageIndex">uint start position</param>
        /// <param name="pageSize">uint end position</param>
        /// <returns>Result is chunk</returns>
        Task<IEnumerable<T>> GetPagedItems(object o, int pageIndex, int pageSize);
        bool HasMoreItems { get; set; }
    }

    public interface ISupportIncrementalLoading
    {
        bool HasMoreItems { get;  }
        Task<LoadMoreItemsResult> LoadMoreItemsAsync(uint count);
    }

    public interface IIncrementalResult<T>
    {
        IEnumerable<T> Items { get; }
        int VirtualCount { get; }
    }

    public struct LoadMoreItemsResult
    {
        public uint Count { get; set; }
    }
///P.Zh。
公共类IncrementalLoadingCollection:ObservableCollection,ISupportIncrementalLoading
其中T:IIncrementalSource,new()
{
私人T源;
私有int itemsPerPage;
私人物品;
私人网页;
公共增量AlloadingCollection(int itemsPerPage=20)
{
this.source=new T();
this.itemsPerPage=itemsPerPage;
this.hasMoreItems=true;
}
公共物品
{
获取{return hasMoreItems;}
}
公共异步任务LoadMoreItemsAsync(uint计数)
{
var task=task.Factory.StartNew(异步()=>
{
uint resultCount=0;
var result=await source.GetPagedItems(null,currentPage++,itemsPerPage);
if(result==null | | result.Count()==0)
{
hasMoreItems=false;
}
其他的
{
resultCount=(uint)result.Count();
Deployment.Current.Dispatcher.BeginInvoke(()=>
{
foreach(结果中的TT项)
本条增加(项目);
});
}
返回新的LoadMoreItemsResult(){Count=resultCount};
}
//,CancellationToken.None,TaskCreationOptions.None,TaskScheduler.Default
).Unwrap();
返回任务。结果;
}       
}
公共接口增量源
{
/// 
///从集合中获取特定时间间隔内的数据块
/// 
///自定义对象
///uint起始位置
///终端位置
///结果是块
任务GetPagedItems(对象o、intPageIndex、intPageSize);
bool HasMoreItems{get;set;}
}
公共接口支持增量加载
{
bool HasMoreItems{get;}
任务加载MoreItemsAsync(uint计数);
}
公共接口IIIncrementalResult
{
IEnumerable项{get;}
int VirtualCount{get;}
}
公共结构LoadMoreItemsResult
{
公共uint计数{get;set;}
}

当我准备好调用示例时,我会在这里发布新的评论。