This article is currently in the process of being translated into Japanese (~93% done).
Using the DataContext
DataContext プロパティは、特に他のソースを指定しない限り、前の章の ElementName プロパティと同じ様に、バインディングのデフォルトソースです。これはWPFウィンドウに含まれるほとんどのクラスから継承されている FrameworkElement クラスで定義されています。単純に置くと、バインディングのおおもとを指定できます。
DataContext プロパティにデフォルトのソースはありません(単純に開始時はnullです)。しかし DataContext はコントロールの階層を通じて継承されるため、DataContext にウィンドウ自身を指定することが出来、全ての子コントロールの何処からでもそれを使うことが出来ます。簡単な例で説明します。
<Window x:Class="WpfTutorialSamples.DataBinding.DataContextSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataContextSample" Height="130" Width="280">
<StackPanel Margin="15">
<WrapPanel>
<TextBlock Text="Window title: " />
<TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" Width="150" />
</WrapPanel>
<WrapPanel Margin="0,10,0,0">
<TextBlock Text="Window dimensions: " />
<TextBox Text="{Binding Width}" Width="50" />
<TextBlock Text=" x " />
<TextBox Text="{Binding Height}" Width="50" />
</WrapPanel>
</StackPanel>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.DataBinding
{
public partial class DataContextSample : Window
{
public DataContextSample()
{
InitializeComponent();
this.DataContext = this;
}
}
}
この例のコードビハインドは、たった1行を加えた興味深いコードです。標準の InitalizeComponent() 呼び出しの後、DataContext に "this" 参照を設定して、基本的にウィンドウ自身をデータコンテキストにすることを伝えます。
XAMLでは、Title や Width , Height を含むいくつかのウィンドウプロパティがバインドされていることを使います。ウィンドウは DataContext を持っていて、それは子コントロールに伝わっているので、それぞれのバインディングのソースを定義する必要はありません。それらがグローバルに有効な値として使うだけです。
サンプルを走らせてウィンドウをリサイズしてみて下さい。大きさの変化が直接テキストボックスに反映されています。また、最初のテキストボックスに異なるタイトルを書いてみて下さい。この変更が直接反映されないのに驚くかもしれません。変更が適用されるには、一旦他のコントロールにフォーカスを動かす必要があります。何故でしょう?これは次章の話題です。
まとめ
DataContext プロパティの使用はコントロールの階層を通して、全てのバインディングの基本設定をしていることに似ています。これは各バインディングのソースを手動で定義する手間を減らします。そして、本当にデータバインディングを使い始めたら、あなたは確実に時間とタイピングの減少が理解できるでしょう。
しかし、これは、ウィンドウの中の全てのコントロールが同じ DataContext を使わなければならないということを意味しません。それぞれのコントロールは自身の DataContext プロパティを持っているので、簡単に継承のつながりを切って、新しい値で DataContext を上書きできます。これはウィンドウのグローバルな DataContext があって、別のフォームや何か別のものを保持しているパネルなど、よりローカルで特定の DataContext を持つことが出来るということです。