<データコンテキストの仕組み>
例:
<Window x:Class="DataContextTestVerC.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525">
   <Page>

       <Page.Resources>
           <XmlDataProvider x:Key="OrderData" XPath="/Test">
               <x:XData>
                   <Test xmlns="">
                       <x Display="×16" ID="16"/>
                       <x Display="×32" ID="32"/>
                       <i Display="×1" ID="1"/>
                       <i Display="×2" ID="2"/>
                       <i Display="×4" ID="4"/>
                       <i Display="×8" ID="8"/>
                       <Person FirstName="山田" LastName="太郎" Age="18"/>
                       <Person FirstName="宇部" LastName="達也" Age="24"/>
                   </Test>
               </x:XData>
           </XmlDataProvider>

           <DataTemplate x:Key="xTemplate">
               <StackPanel Orientation="Horizontal">
                   <Label Content="{Binding XPath=@Display}"/>
                   <Label Content="{Binding XPath=@ID}"/>
               </StackPanel>
           </DataTemplate>
       </Page.Resources>

       <StackPanel DataContext="{Binding Source={StaticResource OrderData}}">
           <TextBlock Text="{Binding XPath=i/@Display}"></TextBlock>
           <TextBlock Text="{Binding XPath=i/@ID}"></TextBlock>
           <TextBlock Text="{Binding XPath=Person/@FirstName}"></TextBlock>
           <TextBlock Text="{Binding XPath=Person/@LastName}"></TextBlock>
           <ListBox ItemsSource="{Binding XPath=/Test/x}" ItemTemplate="{DynamicResource xTemplate}" ></ListBox>

           <ListBox ItemsSource="{Binding XPath=/Test/Person}">
               <ListBox.ItemTemplate>
                   <DataTemplate>
                       <StackPanel Orientation="Horizontal">
                           <Label Content="{Binding XPath=@FirstName}"/>
                           <TextBox Text="{Binding XPath=@LastName}"/>
                           <Label Content="{Binding XPath=@Age}"/>
                       </StackPanel>
                   </DataTemplate>
               </ListBox.ItemTemplate>
           </ListBox>
       
       </StackPanel>
   </Page>

</Window>
  • x:XDataでXML形式のデータ構造を作成している(これにはC#(CLR)を経由せずプロパティと値を持つオブジェクトを、いきなり作成できるという大きな利点がある)
  • XmlDataProviderでWPFから参照している。この際、一意のキー名「OrderData」と名づけて、XPathにより要素のフィルター処理がなされている
  • それらが親エレメントのPageのリソースに仕込まれている
  • pageの子であるStackPanelのDataContextにOrderDataを指定(親のリソースを参照する事に注意。StackPanelのリソースにx:XDataでデーター構造を作成しても自分自身のリソースを参照することになる為スコープ的に参照できない)
  • StackPanelの子は親のDataContextを継承しBindingからOrderDataのプロパティを参照できる。この効果はStackPanelの子すべてに対して得られる
  • ListBox等のコントロールエレメントは自分自身でデーターテンプレートを持てる(リソースからバインディングでキー参照するなどやり易い方法を選ぶと良い)
  • データーテンプレート内の要素はStackPanelやLabel、TextBox等、様々な要素を利用して視覚的に表示する事ができる

例2 もっと単純な例
XAML側
   <Grid>
       <StackPanel Name="StackPanel1" Orientation="Horizontal">
           <Label Content="Point="/>
           <Label Content="{Binding X}" />
           <Label Content="{Binding Y}" />
       </StackPanel>
   </Grid>
C#側
           StackPanel1.DataContext = new Point(10, 20);
V(ビジュアル)でStackPanelの子要素のバインディングで親のデータコンテキストを表示(これは暗黙的になされている)。M(モデル)でStackPanelのDataContextにデータをセットしている
最終更新:2012年10月18日 17:50