下面的代码非常简化。我正在尝试抽象调度程序上下文,以便我的 View 模型可以同步只能在 GUI 线程上引发的事件。
此模式中有一个循环引用。有没有其他方法可以创建 DispatcherObject
?我做错了吗?
我读过其他类似的问题,但答案似乎都涉及对 DispatcherObject
的引用。在 ViewModel
.这是一个可以接受循环引用的地方吗?
class ViewModel {
public DispatcherObject Dispatcher { get; set; }
}
class ModelView : UserControl {
ModelView() {
InitializeComponent();
DataContext = new ViewModel { Dispatcher = this };
}
}
最佳答案
一般来说,循环引用是您要避免的。这里有两种选择:
1.静态抓取dispatcher
快速而肮脏的方法。很容易做到,几乎所有时间都可以正常工作,但与其他任何静态完成的事情一样,它不适合可测试性(这可能是也可能不是问题)。在您的 WPF 应用程序具有多个 UI 线程的极少数情况下,您将无法盲目地使用这种方法。
WPF:var dispatcher = Application.Current.Dispatcher;
银光:var dispatcher = Deployment.Current.Dispatcher;
2.使dispatcher成为ViewModel的依赖
适本地配置你的依赖注入(inject)容器并拥有 Dispatcher
成为那些需要访问它的 ViewModel 的依赖项。这种方法更麻烦,但它允许您使用多个 UI 线程,是可测试的,并且通常具有使用 DI 做事的所有常见优点/缺点。
关于.net - 使用 DispatcherObject.Dispatcher 时如何防止 MVVM 中的循环引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438070/