C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■92073 / 1階層)  【WPF】DataTemplatedeのViewModel
□投稿者/ Hongliang (872回)-(2019/08/23(Fri) 10:03:21)
一般論を言うと、DataContextは基本的に論理ツリーの親から継承するものです。
Windowのようなルート要素を除いて、明示的にDataContextプロパティに
設定することはあんまりありません(ないとは言いませんが)。

UserControlもWindow(とかPage)の子孫要素となる存在なので、
XAML上のルートといえどDataContextプロパティに設定することは普通ではありません。
デザイナで一時的にバインディングが必要であればd:DataContextを使います。

さて、
> <Window.DataContext>
>     <local:MainViewModel/>
> </Window.DataContext>
なので、以下のDataContextはMainViewModelインスタンスが継承されます。
途中でDatacontextが変更されたりしていないので、
> <ContentControl Content="{Binding CurrentPage, Mode=TwoWay}"/>
はMainViewModel::CurrentPageが返すインスタンスがバインドされます。

ここでContentControlはContentTemplateを実体化し、
実体化したUI要素にCurrentPageが返すインスタンスを
以降のツリーのDataContextとして継承させることになります。

CurrentPageが返すインスタンスがAPageViewModel型の場合、
> <DataTemplate DataType="{x:Type vm:APageViewModel}">
>     <view:APageView DataContext="{Binding APageViewModel}"/>
> </DataTemplate>
このDataTemplateが選択されるわけですが、ここで継承されているDataContextは
上述の通りCurrentPageが返すAPageViewModelなので、
このバインディングは
「APageViewModelインスタンスが持つAPageViewModelプロパティ」
ということになります。

このXAMLが要求するViewModelをコードで表現するとこういう形になります。
// INotifyPropertyChanged関連は省略。

class MainViewModel {
    public Hoge CurrentPage { get; set; }
}
class APageViewModel : Hoge {
    // 実際にはこれはコンパイルできない
    public Piyo APageViewModel { get; set; }
}

結論としては、
> <view:APageView DataContext="{Binding APageViewModel}"/>
でわざわざDataContextプロパティを設定する必要はありません。
そしてAPageViewのXAMLでDataContextプロパティを設定しないようにします。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←【WPF】DataTemplatedeのViewModel /tro →Re[2]: 【WPF】DataTemplatedeのViewModel /tro
 
上記関連ツリー

【WPF】DataTemplatedeのViewModel / tro (19/08/23(Fri) 09:13) #92071
【WPF】DataTemplatedeのViewModel / Hongliang (19/08/23(Fri) 10:03) #92073 ←Now
  └ Re[2]: 【WPF】DataTemplatedeのViewModel / tro (19/08/23(Fri) 10:25) #92075
    └ Re[3]: 【WPF】DataTemplatedeのViewModel / Hongliang (19/08/23(Fri) 10:46) #92076
      └ Re[4]: 【WPF】DataTemplatedeのViewModel / tro (19/08/23(Fri) 10:53) #92077
        └ Re[5]: 【WPF】DataTemplatedeのViewModel / Hongliang (19/08/23(Fri) 13:59) #92084
          └ Re[6]: 【WPF】DataTemplatedeのViewModel / Hongliang (19/08/23(Fri) 14:26) #92085
            └ Re[7]: 【WPF】DataTemplatedeのViewModel / tro (19/08/23(Fri) 18:46) #92086
              └ Re[8]: 【WPF】DataTemplatedeのViewModel / Hongliang (19/08/23(Fri) 19:02) #92087
                └ Re[9]: 【WPF】DataTemplatedeのViewModel / tro (19/08/23(Fri) 21:31) #92088

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信