加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

关于在MvvmCross中何时何地使用ObservableCollection的建议

发布时间:2020-12-13 22:27:09 所属栏目:Windows 来源:网络整理
导读:在MvvmCross解决方案中,我有一个单件服务类,它从Web服务获取项目并更新公共ObservableCollection.它每五秒执行一次,可以添加或删除项目或更改其属性. 我还有一个ViewModel,它有一个公共属性,设置为Service的ObservableCollection. View与ObservableCollectio
在MvvmCross解决方案中,我有一个单件服务类,它从Web服务获取项目并更新公共ObservableCollection.它每五秒执行一次,可以添加或删除项目或更改其属性.

我还有一个ViewModel,它有一个公共属性,设置为Service的ObservableCollection. View与ObservableCollection绑定,以便在添加,删除或更改项目时,视图应更新以显示此内容.

但是,正如预期的那样,我得到了一个线程异常,因为ObservableCollection正在由Main / UI之外的线程更新,因此绑定无法更新UI.

在服务中我没有随时可用的InvokeOnMainThread调用,因此在更新ObservableCollection时没有明显的跨平台方式来返回主线程.此外,这样做似乎是错误的 – 服务不应该关注UI问题(而ViewModel可以).

另外,我有点担心从服务中暴露事件,以防这会导致ViewModel不被垃圾收集.我注意到在@ slodge的N 1系列http://mvvmcross.wordpress.com/中,他正在使用一种消息服务,大概是为了避免这种情况.

因此,可能的解决方案可能是发布带有最新项目列表的消息,并且ViewModel可以通过比较消息内容来订阅消息并在UI线程上更新自己的ObservableCollection.但这看起来有点笨重.

任何有关实施此方法的最佳方法的建议都将受到赞赏 – 谢谢.

解决方法

必须在UI线程上调用INotifyCollectionChanged的原始要求实际上来自Windows控制基于添加/删除/移动/替换/重置通知更新的同步方式.

当然,这种同步更新是完全合理的 – 当另一个线程正在积极地更改它时,更新UI显示将非常困难.

.Net 4.5中存在“新的”变化,这可能意味着未来更加美好……但总体而言,这看起来相当复杂 – 请参阅https://stackoverflow.com/a/14602121/373321

我知道处理这个问题的方法与你帖子中概述的基本相同:

A.将ObservableCollection保留在Service / Model层中,并将其中的所有事件封送到UI线程中 – 这可以使用任何继承自MvxMainThreadDispatchingObject的类 – 或者可以通过调用MvxMainThreadDispatcher.Instance.RequestMainThreadAction(action)来完成

虽然不幸的是,这意味着您的服务/模型确实具有一些线程知识,但这种方法可以很好地适用于整体应用体验.

B.在ViewModel中创建集合的副本 – 通过一些弱引用类型机制更新它

>例如通过发送消息告诉它已添加,删除,替换或移动(或完全重置) – 请注意,为了使其工作,消息以正确的顺序到达是很重要的!
>或者例如允许从服务/模型层发送快照

选择以下哪个取决于:

>集合的频率,类型和大小发生变化 – 例如您是否只是偶尔获得单行更新,是否经常进行大量更改,或者您是否主要看到复杂的更改组(就UI而言,基本上是重置)
> UI中所需的动画级别 – 例如应该添加/删除项目动画进/出?如果不需要动画,那么有时可以更简单地用新快照替换整个列表而不是计算增量更改.
>集合本身的大小 – 显然重复大集合可能会导致内存不足问题
>集合所需的持久性 – 如果需要持久性,那么ObservableCollection本身可能不合适,您可能需要使用自定义的INotifyCollectionChanged实现(如the MyCustomList samples)

我个人通常在应用程序中选择(A)方法 – 但它确实取决于情况以及集合的特征及其变化??.

请注意,虽然这绝对是一个mvvm问题,但潜在的问题是一个独立于数据绑定的问题 – 当列表本身在后台线程上更改时,如何更新列表的屏幕显示?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读