ISupportIncrementalLoading Collection – 在LoadingMoreItems正在进行时通知UI
我已经在我的应用程序中创建了一个IncrementalLoadingCollection
类,它实现了ISupportIncrementalLoading
并从ObservableCollection
inheritance。
它工作正常,项目已加载,但我想在应用程序的Status Bar
显示有一些消息正在进行中。
实现这一目标的好方法是什么?
由于在滚动列表时会在内部调用LoadMoreItemsAsync
,因此我无法访问该部分以提供更新Status Bar
的代码。 现在,我在LoadMoreItemsAsync
中这样做,我觉得这是一个糟糕的方法,但到目前为止我找不到更好的…
任何建议都非常感谢。
那么你可以举例:从ObservableCollection
inheritance并实现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
处理程序中发送此消息)
上述就是C#学习教程:ISupportIncrementalLoading Collection – 在LoadingMoreItems正在进行时通知UI分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/954036.html