質問: 以下のサイトを参考にMVVMでの画面遷移を実装しました。 画面(View)、プログラム(ViewModel)構成は以下の通りとなっており、画面切り替えは DataTemplate を利用して、切り替え対象画面(Aページ、Bページ)の View - ViewModel をペア指定をしています。 * MainView(xaml) - MainViewModel(cs) このメイン画面にContentControlを配置し、Contentプロパティを使って表示する画面を変更できるようにし画面遷移を実現 ``` ... ... ... ``` * APageView(xaml) - APageViewModel(cs) 上記Contentプロパティでの切り替え対象の画面A * BPageView(xaml) - BPageViewModel(cs) 上記Contentプロパティでの切り替え対象の画面B 上記内容について、いくつか疑問点がでてきましたので質問させていただきました。 1. MainView.xaml にて Window.DataContext に指定した MainViewModel は、MainView.xaml .cs の InitializeComponent() 実施後には this.DataContext に MainViewModel のインスタンスが設定されており、 このおかげで、MainViewModel で公開しているプロパティと MainView 間での binding が実行可能だと判断していますが間違いないでしょうか? 2. 1 の理解が正しいとして、画面遷移用に準備した APageView - APageViewModel 間も同様の関係かと思い、APageView.xaml.cs の InitializeComponent() 実施後に this.DataContext の内容を確認してみると null となっておりました。 ですが、APageViewModel で公開しているプロパティと APageView 間での bindig は期待通り動作しています。これは何をもって binding が成り立っているのでしょうか? 3. そもそも binding の考え方が間違っているのでしょうか? wpf アプリ初心者でとんでもない間違いを質問しているかもしれませんが宜しくお願いします。
回答: 1. はい、初期化時にDataContextが設定されます。 ``` ``` この部分がそれに当たります。意味は `this.DataContext = new MainViewModel()` と同等です。 2. DataTemplateの挙動になります。 まず、`MainWindow.xaml`と異なりDataContextの定義が`APageView.xaml`に存在しないため、InitializeComponent()では設定されません。 DataTemplateは、データの型にあったViewを用意してからそのDataContextにデータを適用する、という挙動になっているようで、インスタンス生成後に適用されているようです。Loadedイベントで確認するとDataContextに値が設定されていることが確認できると思います。