MVVMに準拠する場合の、小画面の表示処理は、どこで行うべきか。
開発ニワカなりの疑問にぶち当たりました。
MVVMに準拠する場合、小画面の表示処理はどこで行うべきか。
今まで、わりかし気にせず処理はViewModelでやらせてたんですが、親子関係の設定を特にしていないからだったことに気づきました。
親子関係を設定するには、子のウィンドウを生成した時などに、子ウィンドウのオブジェクトのOwnerプロパティに親ウィンドウオブジェクト渡す必要がある。
さて、この親ウィンドウを子にどこでどう渡したものか。
方法はいくつかある。
1.ViewからViewModelへ伝える(View)
ViewはViewModelを知っているので、ViewModel(データコンテキスト)に受け取るフィールドかプロパティを用意して受け渡す。
2.ICommandのExecute(ViewModel)
コマンドパラメータで親ウィンドウを渡してあげる方法
3.コードビハインド(View)
親ウィンドウのコードビハインドに書くならば、そのままchildWindow.Owner = this;
4.ビヘイビア(View)
3の方法をビヘイビア化するだけ
コードビハインドの記述量を減らすなら3よりこっち
5.画面(Window)に関する情報を蓄える、第3のクラスを用意する
パブスタで用意してどこからでも参照できるようにして窓口を作る
さあどれだーなんだけど
正直全部妥協案なような気がしてきてしまう。つまりしっくりきてないというか…
MVVMの概念的に、ViewとViewModelは極力疎結合にしたいから5番になるのかなーって思うし、windowとwindowの話だからViewで完結すべきという話なら、3か4で、コードビハインドに書く量は極力減らすべきだから4かなって
4か5で実装することに。
他にいい方法あるかもだけど思いつかなかった