.net - 使用 DispatcherObject.Dispatcher 时如何防止 MVVM 中的循环引用

标签 .net wpf mvvm dispatcher circular-reference

下面的代码非常简化。我正在尝试抽象调度程序上下文,以便我的 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/

相关文章:

c# - 如何在路径段中包含数字(散列)字符#?

c# - 我想将 SDF 数据库的数据集转换为 WPF 中的可观察集合

wpf - Windows 8/RT/Store TextBox - 每次击键后更新文本绑定(bind)

c# - 在 C# 和 C++ 中将 float / double 乘以 0.5 而不是除以 2 是否安全?

.net - C# 中的 Settings.settings 用于连接字符串

c# - 从通用基类型发出非通用类型

wpf - VS 2010 有什么好的 WPF 调试器/检查器吗?

wpf - 应用 ItemContainerStyle 时,ListView 丢失 GridView 显示

wpf - 将按钮单击事件上的WPF上下文菜单更改为MVVM

c# - Caliburn 在 ComboBox 上重置 SelectedIndex