ISupportIncrementalLoading Collection – 在LoadingMoreItems正在进行时通知UI

我已经在我的应用程序中创建了一个IncrementalLoadingCollection类,它实现了ISupportIncrementalLoading并从ObservableCollectioninheritance。

它工作正常,项目已加载,但我想在应用程序的Status Bar显示有一些消息正在进行中。

实现这一目标的好方法是什么?

由于在滚动列表时会在内部调用LoadMoreItemsAsync ,因此我无法访问该部分以提供更新Status Bar的代码。 现在,我在LoadMoreItemsAsync中这样做,我觉得这是一个糟糕的方法,但到目前为止我找不到更好的…

任何建议都非常感谢。

那么你可以举例:从ObservableCollectioninheritance并实现ISupportIncrementalLoading如下所示:

 class IncrementalLoadingObservableCollection : ObservableCollection, ISupportIncrementalLoading { private readonly Func>> _provideMoreItems; public IncrementalLoadingObservableCollection(Func> provideMoreItems) { _provideMoreItems = provideMoreItems; } public IAsyncOperation LoadMoreItemsAsync(uint count) { return AsyncInfo.Run(async cancelToken => { await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { OnLoadMoreItemsStarted(); }); var providedItems = await _provideMoreItems(cancelToken); await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { foreach(var item in providedItems) Add(item); OnLoadMoreItemsCompleted(); }); return new LoadMoreItemsResult {Count = (uint) providedItems.Count()};; }); } public bool HasMoreItems { get { return true; } } public event Action LoadMoreItemsStarted; public event Action LoadMoreItemsCompleted; protected virtual void OnLoadMoreItemsStarted() { var handler = LoadMoreItemsStarted; if (handler != null) handler(); } protected virtual void OnLoadMoreItemsCompleted() { var handler = LoadMoreItemsCompleted; if (handler != null) handler(); } } 

如何使用它? 在您的ViewModel中:

 class MyFancyItemsViewModel { public MyFancyItemsViewModel() { var incrementalObservablCollcetion = new IncrementalLoading...(GetItemsFromInternetOrSmth); incrementalObservablCollcetion.LoadMoreItemsStarted += OnItemsLoadingStarted; incrementalObservablCollcetion.LoadMoreItemsCompleted += OnItemsLoadingCompleted; ItemsBindedInXaml = incrementalObservablCollcetion; } private Task> GetItemsFromInternetOrSmth(CancellationToken cancelToken) { ... do some work returns enumerable of Items } private void OnItemsLoadingStarted() { .. do smth .. } private void OnItemsLoadingCompleted() { ... do smth .. } public ObservableCollection ItemsBindedInXaml { get; private set; } } 

您可能会问为什么我在IncrementalLoadingObservableCollection使用了Dispatcher.RunAsync – 原因是LoadMoreItemsAsync可能在另一个线程上运行(不知道),因此您必须将所有工作分配给UI Thread (无法调用UI-来自UI thread以外的UI thread相关方法,不使用Dispatcher )。

如果您认为ViewModel不适合与UI相关的操作,请查看一些消息传递机制(如MVVM Light Messenger ,在代码隐藏中注册消息并在LoadMoreItemsStarted处理程序中发送此消息)