0

以下のコードは非常に単純化されています。ビュー モデルが GUI スレッドでのみ発生するイベントを同期できるように、ディスパッチャー コンテキストを抽象化しようとしています。

このパターンには循環参照があります。を作成する他の方法はありますDispatcherObjectか? 私はそれを間違っていますか?

このような他の質問を読んだことがありますが、答えはすべて への参照が含まれているようDispatcherObjectですViewModel。これは循環参照の許容される場所ですか?

class ViewModel {
    public DispatcherObject Dispatcher { get; set; }
}

class ModelView : UserControl {

    ModelView() {
        InitializeComponent();
        DataContext = new ViewModel { Dispatcher = this };
    }
}
4

3 に答える 3

3

Generally speaking, circular references are something you want to avoid. Here are two alternatives:

1. Grab the dispatcher statically

The quick and dirty approach. Very easy to do, will work fine almost all of the time, but as with anything else done statically it does not lend itself to testability (which may or may not be a problem). In the rare instance where your WPF app has more than one UI thread you won't be able to use this approach blindly.

WPF: var dispatcher = Application.Current.Dispatcher;

Silverlight: var dispatcher = Deployment.Current.Dispatcher;

2. Make the dispatcher a dependency of the ViewModel

Configure your dependency injection container appropriately and have the Dispatcher be a dependency for those ViewModels that need to access it. This approach is more hassle but it allows you to work with multiple UI threads, is testable, and in general has all the usual pros/cons of doing things with DI.

于 2012-05-04T07:55:06.047 に答える
1

コントロールから特定のディスパッチャを取得する必要はありません。Deployment を介して直接ディスパッチできます。つまり、Deployment.Current.Dispatcher.BeginInvoke(()=>something) です。

私は通常、ディスパッチャ オブジェクトを提供しませんが、アクション デリゲートを提供します。次に、アクションを実行するだけでスレッドをホッピングせずにテストできますが、本番環境では Dispatcher で呼び出すことができます。

于 2012-05-03T21:11:13.043 に答える
1

DispatcherObject呼び出しに実際に必要なのはディスパッチャー自体であるのに、なぜ への参照を保持するのでしょうか?

class ViewModel {
    public Dispatcher Dispatcher { get; set; } }

class ModelView : UserControl {

    ModelView() {
        InitializeComponent();
        DataContext = new ViewModel { Dispatcher = Dispatcher };
    } }
于 2012-05-04T08:43:45.603 に答える