我应该能够访问属于View的Dispatcher,我需要将它传递给ViewModel.但是视图应该不知道关于ViewModel的任何信息,那么如何传递它呢?是引入一个接口,还是不将其传递给实例,而是创建一个将由视图编写的全局分派器单例?您如何在MVVM应用程序和框架中解决此问题?

编辑:请注意,因为我的ViewModel可能是在后台线程中创建的,所以我不能只在ViewModel的构造函数中执行Dispatcher.Current.

推荐答案

我使用接口IContext抽象了调度器:

public interface IContext
{
   bool IsSynchronized { get; }
   void Invoke(Action action);
   void BeginInvoke(Action action);
}

This has the advantage that you can unit-test your ViewModels more easily.
I inject the interface into my ViewModels using the MEF (Managed Extensibility Framework). Another possibility would be a constructor argument. However, I like the injection using MEF more.

Update (example from pastebin link in comments):

public sealed class WpfContext : IContext
{
    private readonly Dispatcher _dispatcher;

    public bool IsSynchronized
    {
        get
        {
            return this._dispatcher.Thread == Thread.CurrentThread;
        }
    }

    public WpfContext() : this(Dispatcher.CurrentDispatcher)
    {
    }

    public WpfContext(Dispatcher dispatcher)
    {
        Debug.Assert(dispatcher != null);

        this._dispatcher = dispatcher;
    }

    public void Invoke(Action action)
    {
        Debug.Assert(action != null);

        this._dispatcher.Invoke(action);
    }

    public void BeginInvoke(Action action)
    {
        Debug.Assert(action != null);

        this._dispatcher.BeginInvoke(action);
    }
}

.net相关问答推荐

Docker失败文件找不到

使用.NET 8时无法识别运行标识符

Azure Function应用程序-如何升级.NET运行时

使用 Powershell TOM 在 SSAS 表格中创建分区

无法加载文件或程序集 不支持操作. (来自 HRESULT 的异常:0x80131515)

C# - 获取不包括隐藏文件的文件列表

将 BitmapImage 转换为 Bitmap,反之亦然

LINQ:确定两个序列是否包含完全相同的元素

抛出 ArgumentNullException

Select 文件夹对话框 WPF

在 Moq Callback() 调用中设置变量值

Linq查询分组并 Select 第一个项目

如何在 C# 中序列化异常对象?

隐式与显式接口实现

C# 的浮点比较函数

自定义属性的构造函数何时运行?

是否有 Linq 方法可以将单个项目添加到 IEnumerable

如何将 System.Type 转换为其可为空的版本?

.NET 中的对象引用有多大?

Find() 和 First() 抛出异常,如何改为返回 null?