はじめに
WPFの画面遷移の基本は、ContentControlとDataTemplateの組み合わせによるViewの切り替えです。
非常に強力な機構なのですが、データ型(ViewModelクラスの種別)によって、Viewが切り替わるというルールなので、DataTemplateが参照している(DataContextに格納されている)ViewModelは、データクラスとなります。
ContentControlの想定している利用ケースが、データを全て持ったViewModelであり多くの場合は、この方が都合が良いのですが、画面の一部分を切り替えるような画面遷移にContentControlを利用した場合に、不都合が生じる場合があります。
不都合といっても単純に、親のViewが持っているViewModelをDataTemplateの参照しているViewModelへコピーする手間がかかるという程度の話なのですが、表示するだけではなく値を永続化する場合には、厄介なことになります。
親ViewのViewModelをバインディングする
WPFのバインディング機構を熟知されている方なら当然のテクニックなのですが、RelativeSourceで親Viewに対してバインディングを行う事ができます。
独特な書き方なので、暗記するかメモして利用するといいでしょう。
<Slider Width="100"
Height="16"
Maximum="2"
Minimum="0.1"
Value="{Binding DataContext.ZoomValue,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type view:ParentView}}, Mode=TwoWay}" />
バインディングの書式は、色々とあるのですが、ContentControlが複数階層になっていても大丈夫な親Viewを直接検索する方法が、最も単純で簡単な方法です。