在保持视图模型可测试的同时解决此问题的最简洁方法是什么?
答案 0 :(得分:3)
此处的一个选项是在ViewModel中公开可用的SynchronizationContext。这是BackgroundWorker类用于与UI同步的机制,而不会引入对WPF或Windows窗体的依赖,并允许它使用多种技术。
这将允许您编组回UI线程而不参考UI本身,包括Dispatcher。
答案 1 :(得分:1)
你是对的,因为WPF给了我们一个Dispatcher
来使多线程变得简单;但是如果你想将关注点与MVVM模式分开,你需要实现不同的线程策略。
我总是发现BackgroundWorker
类足以满足这一要求,将更新推回到UI线程,这样您就可以更新VM中的ObservableCollection
并将更改传播到图。
答案 2 :(得分:1)
通过抽象所有添加/删除/更新observablecollections的逻辑以及在您的场景中发生在不同线程上的任何其他复杂逻辑,可以很好地解决这个问题。
此控制器类可以负责在正确的线程上更新ViewModel(它可以通过接口引用VM)。
答案 3 :(得分:0)
一个选项是创建一个ObservableCollection的子类,它覆盖OnPropertyChanged和OnCollectionChanged,并将相应的事件调度回UI线程(通过类似SynchronizationContext)。
这使得ViewModel在线程方面更加不可知,它使得测试中的代码也更容易管理。