質問: MVVMの構造に関して、質問させてください。 あるviewの情報を他の画面(view等)から変更する場合、MVVMとしてどういった構造を持つべきでしょうか? 想定としては、常に表示しているviewの背景色等を、他の設定画面やメニューから変更する場合などです。 メニュー等からの変更をどのようにしてviewに伝えてあげれば良いのでしょうか? 熟練者の方々には簡単なお話かと思いますが、初心者ゆえ全くアイデアが出ず、質問させて頂きました。 宜しくお願い致します。 開発環境:Visual Studio 2017 (WPF) 動作環境:Windows10
回答: 設定系の情報は共通の ViewModel に分けて定義し、個別画面毎の ViewModel にその参照を持たせる形に私はしています。 同じ1つの ViewModel を見ることによって設定画面での変更が即座に反映できるというわけです!(逆に個別画面側で変更した内容を設定画面に即座に反映することもできる)。 個別画面の ViewModel に設定情報のような共通 ViewModel の参照を設定する具体的な方法としては MVVM のフレームワークである Prism の DI コンテナを使用することを個人的にはお勧めします。 また、単に設定値の表示だけではなく、設定変更後に何らかの計算をする必要がある場合、個別画面毎の ViewModel で設定側の ViewModel の変更を監視することができます。 ViewModel の監視は ReactiveProperty というライブラリを使うのがお勧めです。 ##### (追記)Binding だけで行う簡易的な方法 過去に使っていた Binding だけで行う簡易的な方法を思い出したので追記します。 設定系ViewModelをシングルトンにするのが許容できるのであれば、個別画面側のXAMLにObjectDataProviderで設定系ViewModelのシングルトンをリソースとして定義し、Bindingできます。 以下みたいな感じです。 * リソース定義(XxxConfig.Instance アクセサでシングルトンが参照できる前提) ``` ``` * リソースの参照個所 Binding ``` ```