关于在MvvmCross中何时何地使用ObservableCollection的建议
在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而言,基本上是重置) 我个人通常在应用程序中选择(A)方法 – 但它确实取决于情况以及集合的特征及其变化??. 请注意,虽然这绝对是一个mvvm问题,但潜在的问题是一个独立于数据绑定的问题 – 当列表本身在后台线程上更改时,如何更新列表的屏幕显示? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在远程调试中避免加载windows dll的符号?
- .net – 如何处理外部DLL中的内存泄漏
- windows – 确定.exe依赖项
- 在Windows上的Scala代码中运行shell命令似乎需要命令的完整
- windows – 从服务启动的进程,CreateProcessWithLogonW立即
- windows-phone-7 – Windows Phone 7 App栏,全球活动
- remote-desktop – 如何终止远程桌面连接上的进程?
- windows – 打开WDK Projects会导致出现“发生一个或多个错
- windows-server-2008-r2 – 如何在重命名审核日志中确定新文
- JsonRequestBehavior不存在问题,JsonRequestBehavior属于哪