使用ViewModels进行UI线程处理

时间:2010-01-21 02:05:38

标签: .net wpf mvvm

  • 必须在UI线程上更新WPF视图中绑定的集合。
  • ViewModel公开了一个集合
  • 因此,当修改ViewModel中的集合时,必须在UI线程
  • 中完成
  • 最佳做法是让ViewModels不了解View,并且可能是Dispatcher等详细信息。

在保持视图模型可测试的同时解决此问题的最简洁方法是什么?

4 个答案:

答案 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在线程方面更加不可知,它使得测试中的代码也更容易管理。