62730


以下のサイトを参考にMVVMでの画面遷移を実装しました。  
<http://torokonbu.blogspot.com/2011/12/mvvm.html>  
画面(View)、プログラム(ViewModel)構成は以下の通りとなっており、画面切り替えは  
DataTemplate を利用して、切り替え対象画面（Aページ、Bページ)の View - ViewModel をペア指定をしています。

  * MainView(xaml) - MainViewModel(cs)  
このメイン画面にContentControlを配置し、Contentプロパティを使って表示する画面を変更できるようにし画面遷移を実現

[code]

       ...
        <Window.Resources>
            <DataTemplate DataType="{x:Type localvm:APageViewModel}">
                <localview:APageView />
            </DataTemplate>
            <DataTemplate DataType="{x:Type localvm:BPageViewModel}">
                <localview:BPageView />
            </DataTemplate>
        </Window.Resources>
    
        <Window.DataContext>
            <localvm:MainViewModel/>
        </Window.DataContext>
       ...
       <ContentControl DockPanel.Dock="Bottom" Content="{Binding CurrentPage}" />
       ...
    
[/code]

  * 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 アプリ初心者でとんでもない間違いを質問しているかもしれませんが宜しくお願いします。


CC BY-SA 4.0
2020-02-02T12:51:13.240
62727
2020-02-02T15:38:45.457
2020-02-02T15:38:45.457
13909
13909
question
c# visual-studio
VisualStudo2017 C# wpf MVVM でのVIew-ViewModelの紐付き(DataContext)について


## 1\. はい、初期化時にDataContextが設定されます。

[code]

        <Window.DataContext>
            <localvm:MainViewModel/>
        </Window.DataContext>
    
[/code]

この部分がそれに当たります。意味は `this.DataContext = new MainViewModel()` と同等です。

## 2\. DataTemplateの挙動になります。

まず、`MainWindow.xaml`と異なりDataContextの定義が`APageView.xaml`に存在しないため、InitializeComponent()では設定されません。  
DataTemplateは、データの型にあったViewを用意してからそのDataContextにデータを適用する、という挙動になっているようで、インスタンス生成後に適用されているようです。Loadedイベントで確認するとDataContextに値が設定されていることが確認できると思います。


CC BY-SA 4.0
2020-02-02T15:25:04.867
62730
2020-02-02T15:25:04.867
14817
62727
answer