【发布时间】:2024-04-30 08:25:02
【问题描述】:
在 MvvmCross 解决方案中,我有一个单例服务类,它从 Web 服务获取项目并更新公共 ObservableCollection。它每五秒执行一次,并且可以添加或删除项目或更改它们的属性。
我还有一个 ViewModel,它有一个设置为服务的 ObservableCollection 的公共属性。 View 绑定到 ObservableCollection,因此当添加、删除或更改项目时,视图应该更新以显示这一点。
但是,正如预期的那样,我遇到了线程异常,因为 ObservableCollection 正在由 Main/UI 之外的线程更新,因此绑定无法更新 UI。
在服务中,我没有现成的InvokeOnMainThread 调用,因此在更新 ObservableCollection 时没有明显的跨平台方法可以返回到主线程。此外,这样做似乎是错误的——Service 不应该关注 UI 问题(而 ViewModel 可以)。
此外,如果这会导致 ViewModel 无法被垃圾收集,我对从服务中公开事件感到有点紧张。我注意到在@slodge 的 N+1 系列http://mvvmcross.wordpress.com/ 中,他使用消息服务大概是为了避免这种情况。
因此,一种可能的解决方案可能是发布带有最新项目列表的消息,并让 ViewModel 订阅该消息并通过将消息内容与其进行比较来在 UI 线程上更新其自己的 ObservableCollection。但这似乎有点笨拙。
任何有关实现此功能的最佳方法的建议都将不胜感激 - 谢谢。
【问题讨论】:
标签: mvvm windows-phone-8 xamarin.ios mvvmcross