1. ホーム
  2. .net

UI DispatcherをViewModelに渡す方法

2023-09-18 04:55:49

質問

にアクセスできるようにする必要があります。 ディスパッチャ を View に属する ViewModel に渡す必要があります。しかし、View は ViewModel について何も知らないはずです。では、どのようにして渡すのでしょうか?インターフェイスを導入するか、インスタンスに渡す代わりに、View によって書き込まれるグローバルなディスパッチャのシングルトンを作成しますか?あなたのMVVMアプリケーションやフレームワークでこれをどのように解決しますか?

EDIT: 私のViewModelsはバックグラウンドスレッドで作成されるかもしれないので、私は単に Dispatcher.Current をViewModelのコンストラクタで実行することはできません。

どのように解決するのですか?

ディスパッチャをインターフェースで抽象化し IContext :

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

これは、ViewModelsのユニットテストをより簡単に行えるという利点があります。

私はMEF (Managed Extensibility Framework)を使ってViewModelsにインターフェースを注入しています。他の可能性としては、コンストラクタの引数でしょう。 しかし、私はMEFを使用した注入がより好きです。

更新しました(コメント中のpastebinリンクからの例)。

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);
    }
}