このセクションには次のサブセクションが含まれています。
前のセクションで説明したいくつかの概念を要約するために、Binding を使用してバインディングを設定します。通常、各バインディングには、バインディング ターゲット、ターゲット プロパティ、バインディング ソース、および使用するソース値へのパスの 4 つのコンポーネントがあります。このセクションでは、バインディングの設定方法について説明します。
次に例を示します。この例では、SDKSample 名前空間内で定義されている MyData という名前のクラスをバインディング ソース オブジェクトに設定しています。デモの目的で、MyData クラスは ColorName という名前の文字列プロパティを持っており、プロパティの値は "Red" に設定されています。したがって、この例では赤い背景のボタンが作成されます。
<DockPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:SDKSample">
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<DockPanel.DataContext>
<Binding Source="{StaticResource myDataSource}"/>
</DockPanel.DataContext>
<Button Background="{Binding Path=ColorName}"
Width="150" Height="30">I am bound to be RED!</Button>
</DockPanel>
バインディング宣言構文の詳細とコードでバインディングを設定する方法の例については、「バインディング宣言の概要」を参照してください。
上の基本的な図にこの例を適用すると、次のような図が得られます。Background プロパティは既定で OneWay バインディングをサポートするため、これは OneWay バインディングになります。
.png)
ColorName プロパティは文字列型で Background プロパティは Brush 型であるにもかかわらず、このバインディングが正常に機能することに疑問を持たれるかもしれません。これは既定の型変換が実行されるためです。型変換については「データ変換」セクションで説明します。
バインディング ソースの指定
前の例では、DockPanel 要素の DataContext プロパティを設定することで、バインディング ソースを指定しています。次に、Button は、その親要素である DockPanel から DataContext 値を継承します。繰り返しますが、バインディング ソース オブジェクトは、バインディングの 4 つの必須コンポーネントの 1 つです。したがって、バインディング ソース オブジェクトが指定されていない場合、バインディングは機能しません。
バインディング ソース オブジェクトを指定する方法はいくつかあります。親要素の DataContext プロパティを使用する方法は、複数のプロパティを同じソースにバインドする場合に役立ちます。ただし、個々のバインディング宣言でバインディング ソースを指定する方が適している場合もあります。前の例の場合は、DataContext プロパティを使用する代わりに、ボタンのバインディング宣言で直接 Source プロパティを設定することでバインディング ソースを指定できます。次に例を示します。
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
Background="{Binding Source={StaticResource myDataSource},
Path=ColorName}">I am bound to be RED!</Button>
DataContext プロパティを要素に直接設定したり、DataContext 値を先祖から継承したり (最初の例のボタンなど)、Binding の Source プロパティの設定でバインディング ソースを明示的に指定する方法以外に、ElementName プロパティまたは RelativeSource プロパティを使用してバインディング ソースを指定する方法もあります。ElementName プロパティは、アプリケーション内の他の要素にバインドする場合 (スライダを使用してボタンの幅を調整する場合など) に役立ちます。RelativeSource プロパティは、ControlTemplate または Style でバインディングを指定する場合に役立ちます。詳細については、「方法 : バインディング ソースを指定する」を参照してください。
値へのパスの指定
バインディング ソースがオブジェクトである場合は、Path プロパティを使用して、バインディングで使用する値を指定します。XML データにバインドする場合は、XPath プロパティを使用して値を指定します。場合によっては、データが XML であっても Path プロパティを使用できます。たとえば、(XPath クエリの結果として) 返された XmlNode の Name プロパティにアクセスする場合は、XPath プロパティに加えて Path プロパティを使用する必要があります。
構文の詳細および例については、Path プロパティと XPath プロパティのページを参照してください。
使用する値への Path はバインディングの 4 つの必須コンポーネントの 1 つであると強調しましたが、オブジェクト全体にバインドするシナリオでは、使用する値はバインディング ソース オブジェクトと同一になります。このような場合には、Path を指定する必要はありません。次に例を示します。
<ListBox ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="true"/>
上の例では、空のバインディング構文 ({Binding}) を使用しています。この場合、ListBox は、親の DockPanel 要素から DataContext を継承します (この例には示されていません)。パスを指定しない場合、既定でオブジェクト全体にバインドされます。つまり、この例では、ItemsSource プロパティをオブジェクト全体にバインドしているため、パスが省略されたことになります (詳細については、「コレクションへのバインド」セクションを参照してください)。
このシナリオは、コレクションにバインドする場合だけでなく、オブジェクトの単一のプロパティの代わりにオブジェクト全体にバインドする場合にも役立ちます。たとえば、ソース オブジェクトが文字列型で、その文字列自体にバインドする場合などです。もう 1 つの一般的なシナリオは、複数のプロパティを持つオブジェクトに要素をバインドする場合です。
カスタム ロジックを適用して、バインドしたターゲット プロパティでデータが有効になるようにしなければならない場合があることに注意してください。カスタム ロジックは、カスタム コンバータの形式になることがあります (既定の型変換が存在しない場合)。コンバータの詳細については、「データ変換」を参照してください。
Binding と BindingExpression
データ バインディングのその他の機能と使用方法について説明する前に、BindingExpression クラスについて説明した方がよいでしょう。前のセクションで説明したように、Binding クラスは、バインディング宣言で使用する高レベルのクラスです。Binding クラスは、バインディングの特性を指定するためのさまざまなプロパティを提供します。関連クラスである BindingExpression クラスは、ソースとターゲットとの関連付けを維持する、基になるオブジェクトです。バインディングには、複数のバインディング式で共有可能な情報がすべて含まれています。BindingExpression は、共有できないインスタンス式であり、Binding に関するインスタンス情報がすべて含まれています。
次に例を示します。myDataObject は MyData クラスのインスタンス、myBinding は Binding ソース オブジェクト、MyData クラスは MyDataProperty という名前の文字列プロパティを含む定義済みクラスです。この例では、TextBlock のインスタンスである mytext のテキスト コンテンツを、MyDataProperty にバインドします。
Dim data1 As New MyData(DateTime.Now)
Dim binding1 As New Binding("MyDataProperty")
binding1.Source = data1
Me.myText.SetBinding(TextBlock.TextProperty, binding1)
//make a new source
MyData myDataObject = new MyData(DateTime.Now);
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);
同じ myBinding オブジェクトを使用して、他のバインディングを作成できます。たとえば、myBinding オブジェクトを使用して、チェック ボックスのテキスト コンテンツを MyDataProperty にバインドできます。このシナリオには、myBinding オブジェクトを共有する BindingExpression のインスタンスが 2 つあります。
BindingExpression オブジェクトは、データ バインドされたオブジェクト上の GetBindingExpression を呼び出した結果の戻り値を使用して取得できます。以下のトピックでは、BindingExpression クラスの使用方法の一部を示します。