前に調べたはずなのにまたわからなくなっていたので、また忘れないように備忘録を残す。
データバィンディングの対象は入れ子になった下位のコントロールに伝播します。
最上位の階層でDataContextに設定したバインドはその下の入れ子になったどの階層でも利用可能です。
ただし途中の階層で新しく設定しなおさない限り。
たとえば以下のようなViewModelがあります。
/// <summary>
/// トップページのViewModelクラス
/// </summary>
class TopPageViewModel : BindableBase
{
public ObservableCollection<Category> categories { set; get; }
public Customer customer { set; get; }
カテゴリー情報を保持したコレクションcategoriesと顧客情報のcustomerを保持しています。
これを以下のような形でPageクラスでDataContextプロパティにセットしています。
this._viewModel = new TopPageViewModel();
// いろいろ処理(中略)
this.DataContext = this._viewModel;
XAML側ではcategoriesを以下のようなコードで利用します。
<GridView
ItemsSource="{Binding Path=categories}"
SelectionMode="Single"
IsItemClickEnabled="True"
ItemClick="categoryItemClick"
ItemTemplate="{StaticResource TopCategoryTemplate}"
Height="300"
Width="1200"
/>
よくあるコレクションへのデータバィンディングのコードです。
この時点でDataGrid以下の階層のDataContextはTopPageViewModelからcategoriesに変更されます。
ではこのGridViewのItemTemplateの中でcustomerプロパティの値を使いたい場合はどのような指定をすればよいでしょう?
DataGrid以上の階層のDataContextにアクセスできればよいのでXAMLの一番上位の要素である
<common:LayoutAwarePage
x:Name="pageRoot"
x:Class="Hoge.Views.TopPage"
pageRootのDataContextを利用しましょう。
その場合のBindingの書き方は以下になります。
{Binding DataContext.customer , ElementName=pageRoot}
これでDataGridの中のテンプレートでcustomerプロパティにアクセスできます。
DataBindingは大事な要素なので後でまとめたいなぁ。
Please give us your valuable comment