<データコンテキストの仕組み>
例:
<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