質問: WPF + Prism + ReactiveProperty(Rx)を使ったアプリケーションを作成しています。 MVVMパターンでViewModelの連携を取る**(連携させて良いかも含めて)**一般的な方法が知りたいです。 例えばAViewModelのプロパティの値が変更されたときに、 BViewModel、CViewModelのプロパティも変更するといったことを みなさんがどのように実現させているか教えてください。 ViewModelは全て1つのプロジェクトで管理されていて、いずれもシングルトンです。 AViewModelのプロパティの値はViewの表示状態を管理するためだけに使用します。 私が思いつく方法を書いてみましたが、別の方法などあれば参考にさせてください。 ### 方法1 **EventAggrigatorを利用してイベントを発行/購読する。** EventAggrigatorは本来モジュール同士連携させるためのもの。 このようなViewModel同士の連携での使用には違和感がある。 ### 方法2 **DIコンテナを利用してViewModelを注入する(BViewModel、CViewModel→AViewModel)** AViewModelにBViewModelとCViewModelのインスタンスを注入。 AViewModelのプロパティ変更されたタイミングでBViewModelとCViewModelのプロパティを変更。 ### 方法3 **DIコンテナを使用してViewModel注入する(AViewModel→BViewModel、CViewModel)** BViewModelとCViewModelにAViewModelのインスタンスを注入。 AViewModelのプロパティの変更監視してBViewModelとCViewModelのプロパティを変更。 ### ViewModel同士を互いに操作させてはダメ? MVVMのModelにまつわる誤解 このサイトではViewModel同士にお互いを操作することは好ましくない旨が書かれています。 今回のようなViewModel同士を連携させることに若干違和感を覚え、なんとなくもやもやしています。
回答: 私もMVVMパターンで設計する時、毎回悩みます。 ViewModelは特に。 そんなに経験は多くないですが、私の見解をまとめます。 一般的にMVVMパターンにおいてViewModel同士を互いに操作することは、少なくとも私の知る限りありません。 > > 例えばAViewModelのプロパティの値が変更されたときに、 > > BViewModel、CViewModelのプロパティも変更するといったことを > > みなさんがどのように実現させているか教えてください。 > > > この内容を私が実現するのであれば、それぞれのViewModelの変更対象プロパティを"Value"とし、"Value"プロパティを実装した"XModel"を作成します。 XModelのValueプロパティの変更通知イベントをそれぞれのViewModelで購読し、そのイベントの着火後にViewModelのValueプロパティを変更する と言った流れにすると思います。 > > 方法1 > > > はViewModel同士の連携に使うべきではないでしょう。 使うならViewModelとModelの連携です。 > > 方法2, 3 > > > ViewModelをDIするとインスタンスの生成順序がどちらかに依存してしまうので良くないと思います。 ViewModelがViewModelに依存するというのも違いますし。 それぞれのレイヤーをより疎結合にすることで、ユニットテストが容易に実装・修正できるため、できるだけ結合度は下げるほうが望ましいと思います。