0

私はWPFを使い始めたばかりで、MVVMの方法で物事をやろうとしています(この素晴らしい記事に従ってください)。

すべてのビュー モデルが対話する必要がある中央マネージャー クラスがあります。シングルトンを使用してこれを実装したので、シングルトン クラスがあります。

public class FakeManager
    {

        private FakeManager() {}

        static FakeManager instance;
        public static FakeManager Instance
        {
            get { return instance ?? (instance = new FakeManager()); }
        }

        ...
    }

そして、私のビューモデルでは、次のようにやり取りします。

public ICommand TriggerChannelChange
{
    get
    {
        return new RelayCommand(() => FakeManager.Instance.SetupChangeRequest(_hardwareItem), () => true);
    }
}

私の質問は - より良い方法はありますか? ビューモデル間でメッセージを送信するために WPF で一般的に使用されるイベント メディエーター パターンを知っていますが、ここでより良いものはありますか? 私がやったことに関する私の問題は、私が FakeManager と密接に結びついているという事実と、少し不器用に感じていることだと思います。

ありがとう

4

2 に答える 2

1

すでに述べたパブリッシュ/サブスクライバーパターンが、ここでの私の推奨アプローチです。Prismには、を使用した優れた実装がありEventAggregatorます。

このように設定することの利点は、コードの分離に加えて、問題のあるドメインについてはるかにクリーンな方法で推論できることです。ビューモデルを、システムを介して明確に定義された(ドメイン言語で)メッセージを送信する独立した「島」として持つことができます。ビューモデルは、他のパーツがビューモデルにどのように作用するかについて何も知る必要はありません。これらのメッセージは、システムの概念的に不可欠な部分であり、そのようにモデル化する価値があります。また、テストが容易になり、新しい機能を導入してそれらのメッセージと相互作用するバグを修正するタスクが大幅に簡素化されます。

于 2012-10-12T13:37:44.923 に答える
1

まず、プロパティ ゲッターで新しいコマンドを作成すると、次のようなプロパティ ゲッターの一般的な期待に反するという盲目的な意見に同意します。

  • 彼らは非常に軽量であること
  • (おそらくセッターを介して)置き換えられない限り、同じオブジェクトを返すこと

しかし、それは余談なので、私はそれを苦労しません。

あなたの質問については、サービス パターンを調べることをお勧めします。これにより、サービスのインターフェイスを定義し、ビュー モデルがそのサービスに依存します。サービスを受ける方法は多種多様です。サービス ロケーター パターンから簡単に始めるか、依存性注入またはMEFを検討することをお勧めします。

于 2012-10-12T12:56:36.037 に答える