バインディング宣言の概要Binding Declarations Overview

このトピックでは、バインディングを宣言するさまざまな方法について説明します。This topic discusses the different ways you can declare a binding.

必須コンポーネントPrerequisites

このトピックを読む前に、マークアップ拡張機能の概念と使用方法について理解している必要があります。Before reading this topic, it is important that you are familiar with the concept and usage of markup extensions. マークアップ拡張機能の詳細については、 「マークアップ拡張機能と WPF XAML」を参照してください。For more information about markup extensions, see Markup Extensions and WPF XAML.

このトピックでは、データ バインディングの概念については説明しません。This topic does not cover data binding concepts. データ バインディングの概念の詳細については、「Data Binding Overview」を参照してください。For a discussion of data binding concepts, see Data Binding Overview.

XAML でのバインディングの宣言Declaring a Binding in XAML

このセクションでは、XAML でバインディングを宣言する方法について説明します。This section discusses how to declare a binding in XAML.

マークアップ拡張機能の使用方法Markup Extension Usage

Binding はマークアップ拡張機能です。Binding is a markup extension. バインディング拡張機能を使用してバインディングを宣言するとき、この宣言は、Binding キーワードに続く一連の句で構成され、コンマ (,) で区切られます。When you use the binding extension to declare a binding, the declaration consists of a series of clauses following the Binding keyword and separated by commas (,). バインディング宣言内の句の順序は任意で、多数の組み合わせが可能です。The clauses in the binding declaration can be in any order and there are many possible combinations. 句は名前=ペアで名前の名前を指定します、Bindingプロパティとはプロパティを設定する値。The clauses are Name=Value pairs where Name is the name of the Binding property and Value is the value you are setting for the property.

マークアップでバインディング宣言文字列を作成する場合、この文字列はターゲット オブジェクトの特定の依存関係プロパティにアタッチする必要があります。When creating binding declaration strings in markup, they must be attached to the specific dependency property of a target object. 次の例では、バインドする方法を示しています、TextBox.Textバインド拡張機能を使用して、指定するプロパティ、SourcePathプロパティ。The following example shows how to bind the TextBox.Text property using the binding extension, specifying the Source and Path properties.

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

ほとんどのプロパティを指定することができます、Bindingクラスのこのようにします。You can specify most of the properties of the Binding class this way. バインディング拡張は、の一覧の場合と同様の詳細についてはBindingバインド拡張機能を使用して設定できないプロパティを参照してください、バインディング マークアップ拡張の概要。For more information about the binding extension as well as for a list of Binding properties that cannot be set using the binding extension, see the Binding Markup Extension overview.

オブジェクト要素構文Object Element Syntax

オブジェクト要素構文は、バインディング宣言を作成する代替の方法です。Object element syntax is an alternative to creating the binding declaration. ほとんどの場合は、マークアップ拡張機能の使用とオブジェクト要素構文の使用のどちらにも特別な利点はありません。In most cases, there is no particular advantage to using either the markup extension or the object element syntax. ただし、マークアップ拡張機能がサポートしないシナリオでは (プロパティ値が文字列タイプではなく、このタイプの変換が存在しない場合)、オブジェクト要素構文を使用する必要があります。However, in cases which the markup extension does not support your scenario, such as when your property value is of a non-string type for which no type conversion exists, you need to use the object element syntax.

オブジェクト要素構文とマークアップ拡張機能の使用の両方の例を次に示します。The following is an example of both the object element syntax and the markup extension usage:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

例では、バインド、Foreground拡張構文を使用してバインディングを宣言することでプロパティ。The example binds the Foreground property by declaring a binding using the extension syntax. バインディング宣言、Textプロパティは、オブジェクト要素構文を使用します。The binding declaration for the Text property uses the object element syntax.

別の用語の詳細については、「XAML Syntax の詳細」を参照してください。For more information about the different terms, see XAML Syntax In Detail.

MultiBinding と PriorityBindingMultiBinding and PriorityBinding

MultiBinding PriorityBinding XAML 拡張構文をサポートしていません。MultiBinding and PriorityBinding do not support the XAML extension syntax. 宣言している場合、オブジェクト要素構文を使用する必要があります、MultiBindingまたはPriorityBindingXAML でします。Therefore, you must use the object element syntax if you are declaring a MultiBinding or a PriorityBinding in XAML.

コードでバインディングを作成する方法Creating a Binding in Code

バインディングを指定する別の方法がプロパティを直接設定するには、Bindingコード内のオブジェクト。Another way to specify a binding is to set properties directly on a Binding object in code. 次の例を作成する方法を示しています、Bindingオブジェクトし、コードでプロパティを指定します。The following example shows how to create a Binding object and specify the properties in code. この例でTheConverterを実装するオブジェクトには、IValueConverterインターフェイス。In this example, TheConverter is an object that implements the IValueConverter interface.

private void OnPageLoaded(object sender, EventArgs e)
{
    // Make a new source, to grab a new timestamp
    MyData myChangedData = new MyData();
    
    // Create a new binding
    // TheDate is a property of type DateTime on MyData class
    Binding myNewBindDef = new Binding("TheDate");
    
    myNewBindDef.Mode = BindingMode.OneWay;
    myNewBindDef.Source = myChangedData;
    myNewBindDef.Converter = TheConverter;
    myNewBindDef.ConverterCulture = new CultureInfo("en-US");
    
      // myDatetext is a TextBlock object that is the binding target object
    BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
    BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);

    lbChooseCulture.SelectedIndex = 0;
}
 Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
     ' Make a new source, to grab a new timestamp
     Dim myChangedData As New MyData()

     ' Create a new binding
 ' TheDate is a property of type DateTime on MyData class
     Dim myNewBindDef As New Binding("TheDate")

     myNewBindDef.Mode = BindingMode.OneWay
     myNewBindDef.Source = myChangedData
     myNewBindDef.Converter = TheConverter
     myNewBindDef.ConverterCulture = New CultureInfo("en-US")

' myDatetext is a TextBlock object that is the binding target object
     BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
     BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)

     lbChooseCulture.SelectedIndex = 0
 End Sub

バインドするオブジェクトがある場合、FrameworkElementまたはFrameworkContentElement呼び出すことができます、SetBindingメソッドをオブジェクトを使用してではなく、直接BindingOperations.SetBindingします。If the object you are binding is a FrameworkElement or a FrameworkContentElement you can call the SetBinding method on your object directly instead of using BindingOperations.SetBinding. 例については、「Create a Binding in Code」を参照してください。For an example, see Create a Binding in Code.

バインディング パス構文Binding Path Syntax

使用して、Pathプロパティにバインドするソース値を指定します。Use the Path property to specify the source value you want to bind to:

  • 最も簡単なケースで、Pathプロパティの値など、バインドに使用するソース オブジェクトのプロパティの名前は、Path=PropertyNameします。In the simplest case, the Path property value is the name of the property of the source object to use for the binding, such as Path=PropertyName.

  • 同様の構文でプロパティのサブプロパティを指定できますC#します。Subproperties of a property can be specified by a similar syntax as in C#. たとえば、句 Path=ShoppingCart.Order は、バインディングをオブジェクトのサブプロパティ Order またはプロパティ ShoppingCart に設定します。For instance, the clause Path=ShoppingCart.Order sets the binding to the subproperty Order of the object or property ShoppingCart.

  • 添付プロパティにバインドするには、添付プロパティをかっこで囲みます。To bind to an attached property, place parentheses around the attached property. たとえば、添付プロパティにバインドするDockPanel.Dock、構文はPath=(DockPanel.Dock)します。For example, to bind to the attached property DockPanel.Dock, the syntax is Path=(DockPanel.Dock).

  • プロパティのインデクサーは、インデクサーが適用されているプロパティ名の後ろの角かっこ内に指定できます。Indexers of a property can be specified within square brackets following the property name where the indexer is applied. たとえば、句 Path=ShoppingCart[0] は、プロパティの内部インデックスがリテラル文字列「0」を処理する方法に対応するインデックスへのバインディングを設定します。For instance, the clause Path=ShoppingCart[0] sets the binding to the index that corresponds to how your property's internal indexing handles the literal string "0". 入れ子になったインデクサーもサポートします。Nested indexers are also supported.

  • Path 句ではインデクサーとサブプロパティを混在させることができます。例: Path=ShoppingCart.ShippingInfo[MailingAddress,Street].Indexers and subproperties can be mixed in a Path clause; for example, Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • インデクサーの内側には、コンマ (,) で区切られた複数のインデクサー パラメーターを設定できます。Inside indexers you can have multiple indexer parameters separated by commas (,). かっこで囲んで各パラメーターの型を指定できます。The type of each parameter can be specified with parentheses. たとえば、あるPath="[(sys:Int32)42,(sys:Int32)24]"ここで、sysにマップされて、System名前空間。For example, you can have Path="[(sys:Int32)42,(sys:Int32)24]", where sys is mapped to the System namespace.

  • ソースがコレクション ビューの場合は、スラッシュ (/) で、現在の項目を指定できます。When the source is a collection view, the current item can be specified with a slash (/). 句ではたとえば、Path=/ビューの現在の項目にバインディングを設定します。For example, the clause Path=/ sets the binding to the current item in the view. ソースがコレクションである場合は、この構文は、既定のコレクション ビューの現在の項目を指定します。When the source is a collection, this syntax specifies the current item of the default collection view.

  • プロパティは、コレクションを走査するプロパティの名前とスラッシュを結合できます。Property names and slashes can be combined to traverse properties that are collections. たとえば、Path=/Offices/ManagerNameを含むソース コレクションの現在の項目を指定します、Officesコレクションでもあるプロパティ。For example, Path=/Offices/ManagerName specifies the current item of the source collection, which contains an Offices property that is also a collection. 現在の項目が格納しているオブジェクト、ManagerNameプロパティ。Its current item is an object that contains a ManagerName property.

  • 必要に応じて、現在のソースにバインドするピリオド (.) のパスを使用できます。Optionally, a period (.) path can be used to bind to the current source. たとえば、Text="{Binding}" は、Text="{Binding Path=.}" と同じです。For example, Text="{Binding}" is equivalent to Text="{Binding Path=.}".

エスケープのしくみEscaping Mechanism

  • インデクサー ([ ]) 内では、キャレット文字 (^) は次の文字をエスケープします。Inside indexers ([ ]), the caret character (^) escapes the next character.

  • 設定した場合PathXAML でする必要がありますが、XML 言語定義に特殊な特定の文字エスケープ (XML エンティティを使用)。If you set Path in XAML, you also need to escape (using XML entities) certain characters that are special to the XML language definition:

    • 文字 "&" をエスケープするには、& を使用します。Use & to escape the character "&".

    • 使用する>終了タグをエスケープする">"です。Use > to escape the end tag ">".

  • さらに、マークアップ拡張構文を使用して属性のバインディング全体を記述する場合、WPFWPF マークアップ拡張機能パーサーで特別な意味を持つ文字を (円記号 \ を使用して) エスケープする必要があります。Additionally, if you describe the entire binding in an attribute using the markup extension syntax, you need to escape (using backslash \) characters that are special to the WPFWPF markup extension parser:

    • 円記号 (\) はエスケープ文字そのものです。Backslash (\) is the escape character itself.

    • 等号 (=) は、プロパティ名とプロパティの値を区切ります。The equal sign (=) separates property name from property value.

    • コンマ (,) はプロパティを区切ります。Comma (,) separates properties.

    • 右中かっこ (}) は、マークアップ拡張機能の終わりです。The right curly brace (}) is the end of a markup extension.

既定の動作Default Behaviors

既定の動作は、宣言で指定されていない場合には次のとおりです。The default behavior is as follows if not specified in the declaration.

  • バインディング ソースの値とバインディング ターゲットの値の型変換を実行しようとする既定のコンバーターが作成されます。A default converter is created that tries to do a type conversion between the binding source value and the binding target value. 変換を実行できない場合、既定のコンバーターは null を返します。If a conversion cannot be made, the default converter returns null.

  • 設定しない場合ConverterCulture、バインディング エンジンは、Languageバインディング ターゲット オブジェクトのプロパティ。If you do not set ConverterCulture, the binding engine uses the Language property of the binding target object. XAML では、既定で "en-US" になるか、または明示的に設定されている場合にはページのルート要素 (または任意の要素) から値を継承します。In XAML, this defaults to "en-US" or inherits the value from the root element (or any element) of the page, if one has been explicitly set.

  • バインディングと同じくらいは既にデータ コンテキスト (たとえば、継承されたデータ コンテキストの親要素から)、およびどのような項目またはそのコンテキストによって返されるコレクションは、バインディングの適切なパスの変更を必要とせず、バインディング宣言を持たない句で。{Binding} これは、多くの場合、データのスタイル設定、バインディングがコレクションには機能のバインドが指定する方法です。As long as the binding already has a data context (for instance, the inherited data context coming from a parent element), and whatever item or collection being returned by that context is appropriate for binding without requiring further path modification, a binding declaration can have no clauses at all: {Binding} This is often the way a binding is specified for data styling, where the binding acts upon a collection. 詳細については、「バインディング ソースの概要」の「バインディング ソースとして使用する全体オブジェクト」セクションを参照してください。For more information, see the "Entire Objects Used as a Binding Source" section in the Binding Sources Overview.

  • 既定のMode一方向と双方向で異なりますバインドされている依存関係プロパティによって異なります。The default Mode varies between one-way and two-way depending on the dependency property that is being bound. 常にバインディング モードを明示的に宣言し、バインディングに目的の動作があることを確認できます。You can always declare the binding mode explicitly to ensure that your binding has the desired behavior. 一般的に、ユーザーが編集可能なコントロールのプロパティでなどTextBox.TextRangeBase.Value、既定の他のほとんどのプロパティは既定で一方向のバインドは双方向のバインディング。In general, user-editable control properties, such as TextBox.Text and RangeBase.Value, default to two-way bindings, whereas most other properties default to one-way bindings.

  • 既定のUpdateSourceTrigger値によって異なりますPropertyChangedLostFocusも、バインドされた依存関係プロパティによって異なります。The default UpdateSourceTrigger value varies between PropertyChanged and LostFocus depending on the bound dependency property as well. ほとんどの依存関係プロパティの既定値は PropertyChanged です。ただし、TextBox.Text プロパティの既定値は LostFocus です。The default value for most dependency properties is PropertyChanged, while the TextBox.Text property has a default value of LostFocus.

関連項目See also