参考コード
ICommandインターフェイスを実装したコマンドを利用して、表示します。
MVVM_WindowCommands
https://github.com/mike-eason/MVVM_WindowCommands
のコードを見てみましょう。
View
コマンドを指定して、そのパラメータにウインドウ名を指定しています。
<Button Content="Open Window"
Command="{Binding OpenWindowCommand}"
CommandParameter="{x:Type local:TestWindow}"/>
ViewModel
OpenWindowCommand
public class MainWindowViewModel
{
public OpenWindowCommand OpenWindowCommand { get; private set; }
public ShowDialogCommand ShowDialogCommand { get; private set; }
public MainWindowViewModel()
{
OpenWindowCommand = new OpenWindowCommand();
ShowDialogCommand = new ShowDialogCommand(PostOpenDialog, PreOpenDialog);
}
Commandクラス(Modelに該当する部分?)
ここで、Showしています。
ViewとViewModel以外は、すべてModelと考えますから、この部分もModelという認識で良いと思いますが、どうでしょうか。(VMのコードで、modelに相当するものではなく、単にView・ViewModelではないという意味で)
public class OpenWindowCommand : ICommand
{
protected virtual void OpenWindow(Window wnd)
{
wnd.Show();
}
分からない点
この処理の流れで、TestWindowを確定して表示を行っているのはどこでしょうか?
Viewでしょうか、ViewModelでしょうか、OpenWindowCommandでしょうか?
これは、x:Type local:TestWindow とTestWindowと名前を指定しているViewだと私は考えるのですが、違うのでしょうか?
ViewModelも、OpenWindowCommandも、引数を与えられて処理を行う部分ですから、TestWindowと確定しているわけではありません。
従って、TestWindowというViewを知っているのは、ViewのMainWindowだと私には思えます。そうすると、基本パターン1と、同じですね。基本パターン1はコードビハインドで、Viewから指定したViewを表示していますが、このパターンは、XAMLでコマンドを利用して、Viewから指定したViewを表示します。
TestWindowを指定するところを変更する場合
けれども、XAMLで
CommandParameter="{x:Type local:TestWindow}"
を指定せず、
- MainWindowViewModelでTestWindowを指定する → VMが他のViewを知っている
- OpenWindowCommandでTestWindowを指定する → Mが他のViewを知っている
ことになると考えますが、この考え方で合っているでしょうか。
記事予定
- パターン1 Viewのコードビハインド
- パターン2 Commandパラメータ(この記事)
- パターン3 Prism の Dialog Service
- パターン4 引数を渡す(予定)