PropertyPath の XAML 構文PropertyPath XAML Syntax

オブジェクトPropertyPathでは、 PropertyPath型をXAMLXAML値として受け取るさまざまなプロパティを設定するための複雑なインライン構文がサポートされています。The PropertyPath object supports a complex inline XAMLXAML syntax for setting various properties that take the PropertyPath type as their value. このトピックではPropertyPath 、バインドとアニメーションの構文に適用される構文について説明します。This topic documents the PropertyPath syntax as applied to binding and animation syntaxes.

PropertyPath を使用する場所Where PropertyPath Is Used

PropertyPathは、いくつかWindows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)の機能で使用される共通のオブジェクトです。PropertyPath is a common object that is used in several Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) features. 共通PropertyPathのを使用してプロパティパス情報を伝達する場合でPropertyPathも、が型として使用される各機能領域の使用方法は異なります。Despite using the common PropertyPath to convey property path information, the usages for each feature area where PropertyPath is used as a type vary. そのため、機能ごとに構文を説明する方が実際的です。Therefore, it is more practical to document the syntaxes on a per-feature basis.

主にWPFWPFPropertyPathはを使用して、オブジェクトのデータソースのプロパティを走査するためのオブジェクトモデルのパスを記述し、対象となるアニメーションのターゲットパスを記述します。Primarily, WPFWPF uses PropertyPath to describe object-model paths for traversing the properties of an object data source, and to describe the target path for targeted animations.

などSetter.Propertyの一部のスタイルおよびテンプレートプロパティは、 PropertyPath、一見、に似た修飾プロパティ名を受け取ります。Some style and template properties such as Setter.Property take a qualified property name that superficially resembles a PropertyPath. ただしPropertyPath、これは真実ではありません。これは修飾所有者です。 WPF XAMLXAMLプロセッサによって有効にされるプロパティ文字列形式の使用は、のDependencyProperty型コンバーターと組み合わせて使用されます。But this is not a true PropertyPath; instead it is a qualified owner.property string format usage that is enabled by the WPF XAMLXAML processor in combination with the type converter for DependencyProperty.

データ バインディングにおけるオブジェクトの PropertyPathPropertyPath for Objects in Data Binding

データ バインディングは WPFWPF の機能であり、依存関係プロパティのターゲット値にバインドできます。Data binding is a WPFWPF feature whereby you can bind to the target value of any dependency property. ただし、このようなデータ バインディングのソースが依存関係プロパティである必要はなく、適切なデータ プロバイダーで認識される任意のプロパティ型でかまいません。However, the source of such a data binding need not be a dependency property; it can be any property type that is recognized by the applicable data provider. プロパティパスは、共通言語ランタイムObjectDataProvider(CLR) オブジェクトとそのプロパティからバインディングソースを取得するために使用される、特にに使用されます。Property paths are particularly used for the ObjectDataProvider, which is used for obtaining binding sources from common language runtime (CLR) objects and their properties.

XMLXMLにはを使用PropertyPath Path しないため、へのデータバインディングではが使用されないことに注意Bindingしてください。Note that data binding to XMLXML does not use PropertyPath, because it does not use Path in the Binding. 代わりに、を使用XPathして、データXML ドキュメント オブジェクト モデル (DOM)XML Document Object Model (DOM)のに有効な XPath 構文を指定します。Instead, you use XPath and specify valid XPath syntax into the XML ドキュメント オブジェクト モデル (DOM)XML Document Object Model (DOM) of the data. XPathも文字列として指定されていますが、ここには記載されていません。「 XMLDataProvider と XPath クエリを使用して XML データにバインドする」を参照してください。XPath is also specified as a string, but is not documented here; see Bind to XML Data Using an XMLDataProvider and XPath Queries.

データ バインディングにおけるプロパティ パスを理解するうえで鍵となるのは、個々のプロパティ値をバインドの対象にすることも、リストまたはコレクションを使用するターゲット プロパティにバインドすることもできるということです。A key to understanding property paths in data binding is that you can target the binding to an individual property value, or you can instead bind to target properties that take lists or collections. コレクション内のデータ項目の数に応じてListBox拡張されるをバインドする場合などにコレクションをバインドする場合、プロパティパスは個別のコレクションアイテムではなく、コレクションオブジェクトを参照する必要があります。If you are binding collections, for instance binding a ListBox that will expand depending on how many data items are in the collection, then your property path should reference the collection object, not individual collection items. データバインディングエンジンは、データソースとして使用されるコレクションをバインディングターゲットの型に自動的に一致させます。これにListBoxより、に項目配列を設定するなどの動作が行われます。The data binding engine will match the collection used as the data source to the type of the binding target automatically, resulting in behavior such as populating a ListBox with an items array.

データ コンテキストとしての直接のオブジェクト上の単一のプロパティSingle Property on the Immediate Object as Data Context

<Binding Path="propertyName" .../>

propertyNameは、現在DataContext Pathので使用されているプロパティの名前に解決される必要があります。propertyName must resolve to be the name of a property that is in the current DataContext for a Path usage. バインドがソースを更新する場合、そのプロパティは読み書き可能であり、ソース オブジェクトは変更可能である必要があります。If your binding updates the source, that property must be read/write and the source object must be mutable.

データ コンテキストとしての直接のオブジェクト上の単一のインデクサーSingle Indexer on the Immediate Object as Data Context

<Binding Path="[key]" .../>

key には、ディクショナリまたはハッシュ テーブルに対する型指定されたインデックス、または配列の整数インデックスを指定する必要があります。key must be either the typed index to a dictionary or hash table, or the integer index of an array. また、キーの値は、適用先のプロパティに直接バインドできる型である必要があります。Also, the value of the key must be a type that is directly bindable to the property where it is applied. たとえば、文字列キーと文字列値を含むハッシュテーブルをこの方法で使用して、 TextBoxのテキストにバインドすることができます。For instance, a hash table that contains string keys and string values can be used this way to bind to Text for a TextBox. キーがコレクションまたはサブインデックスを指す場合は、この構文を使用して、ターゲット コレクション プロパティにバインドできます。Or, if the key points to a collection or subindex, you could use this syntax to bind to a target collection property. それ以外の場合は、<Binding Path="[key].propertyName" .../> などの構文を通じて、特定のプロパティを参照する必要があります。Otherwise, you need to reference a specific property, through a syntax such as <Binding Path="[key].propertyName" .../>.

必要に応じて、インデックスの型を指定できます。You can specify the type of the index if necessary. インデックス付きプロパティパスのこの側面の詳細についてBinding.Pathは、「」を参照してください。For details on this aspect of an indexed property path, see Binding.Path.

複数プロパティ (間接的なプロパティのターゲット設定)Multiple Property (Indirect Property Targeting)

<Binding Path="propertyName.propertyName2" .../>

propertyNameは、現在DataContextののプロパティの名前に解決される必要があります。propertyName must resolve to be the name of a property that is the current DataContext. パス プロパティ propertyNamepropertyName2 は、リレーションシップ内に存在する任意のプロパティにすることができます。propertyName2 は、propertyName の値である型に存在するプロパティです。The path properties propertyName and propertyName2 can be any properties that exist in a relationship, where propertyName2 is a property that exists on the type that is the value of propertyName.

添付または型修飾された単一のプロパティSingle Property, Attached or Otherwise Type-Qualified

<object property="(ownerType.propertyName)" .../>

かっこは、内のPropertyPathこのプロパティを部分修飾を使用して構築する必要があることを示しています。The parentheses indicate that this property in a PropertyPath should be constructed using a partial qualification. XML 名前空間を使用して、適切なマッピングを含む型を検出できます。It can use an XML namespace to find the type with an appropriate mapping. ownerType 、各アセンブリのXAMLXAML XmlnsDefinitionAttribute宣言を通じて、プロセッサがアクセスできる型を検索します。The ownerType searches types that a XAMLXAML processor has access to, through the XmlnsDefinitionAttribute declarations in each assembly. ほとんどのアプリケーションは、http://schemas.microsoft.com/winfx/2006/xaml/presentation 名前空間にマップされた既定の XML 名前空間を持ちます。そのため、プレフィックスは通常、カスタム型や、名前空間の外部の型に限って必要です。Most applications have the default XML namespace mapped to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace, so a prefix is usually only necessary for custom types or types otherwise outside that namespace. propertyName は、ownerType に存在するプロパティの名前に解決される必要があります。propertyName must resolve to be the name of a property existing on the ownerType. この構文は、通常、次のいずれかの場合に使用されます。This syntax is generally used for one of the following cases:

  • 指定されたターゲット型を持たないスタイルまたはテンプレート内の XAMLXAML でパスが指定されている場合。The path is specified in XAMLXAML that is in a style or template that does not have a specified Target Type. 通常、これ以外のケースでの修飾子の使用は無効です。スタイルやテンプレート以外のケースでは、プロパティは型ではなくインスタンス上に存在します。A qualified usage is generally not valid for cases other than this, because in non-style, non-template cases, the property exists on an instance, not a type.

  • プロパティが添付プロパティの場合。The property is an attached property.

  • 静的プロパティにバインドしている場合。You are binding to a static property.

ストーリーボードターゲットとして使用するにはpropertyName 、としDependencyPropertyて指定されたプロパティがである必要があります。For use as storyboard target, the property specified as propertyName must be a DependencyProperty.

ソースの走査 (コレクションの階層へのバインド)Source Traversal (Binding to Hierarchies of Collections)

<object Path="propertyName/propertyNameX" .../>

この構文で、/ は階層的なデータ ソース オブジェクト内を移動するために使用されます。また、/ 文字を連続で使用することによる階層内での複数ステップの移動がサポートされています。The / in this syntax is used to navigate within a hierarchical data source object, and multiple steps into the hierarchy with successive / characters are supported. ソースの走査は現在のレコード ポインター位置に対応しており、これはデータをビューの UI と同期することによって決定されます。The source traversal accounts for the current record pointer position, which is determined by synchronizing the data with the UI of its view. 階層的なデータ ソース オブジェクトのバインドおよびデータ バインディングにおける現在のレコード ポインターの概念の詳細については、「階層データでマスター詳細パターンを使用する」または「データ バインディングの概要」を参照してください。For details on binding with hierarchical data source objects, and the concept of current record pointer in data binding, see Use the Master-Detail Pattern with Hierarchical Data or Data Binding Overview.

注意

この構文は、一見すると XPathXPath に似ています。Superficially, this syntax resembles XPathXPath. データソースXPathXPath Path XPathにバインドするための true 式は、値として使用されず、相互排他的なプロパティに使用する必要があります。 XMLXMLA true XPathXPath expression for binding to an XMLXML data source is not used as a Path value and should instead be used for the mutually exclusive XPath property.

コレクション ビューCollection Views

名前付きコレクション ビューを参照するには、コレクション ビュー名の前にハッシュ記号 (#) を付けます。To reference a named collection view, prefix the collection view name with the hash character (#).

現在のレコード ポインターCurrent Record Pointer

コレクション ビューまたはマスター詳細データ バインディング シナリオの現在のレコード ポインターを参照するには、パス文字列の先頭にスラッシュ (/) を追加します。To reference the current record pointer for a collection view or master detail data binding scenario, start the path string with a forward slash (/). スラッシュより後ろのパスは、現在のレコード ポインターから開始して走査されます。Any path past the forward slash is traversed starting from the current record pointer.

複数のインデクサーMultiple Indexers

<object Path="[index1,index2...]" .../>

またはor

<object Path="propertyName[index,index2...]" .../>

あるオブジェクトが複数のインデクサーをサポートする場合、それらのインデクサーは、配列参照構文のように、順番に指定できます。If a given object supports multiple indexers, those indexers can be specified in order, similar to an array referencing syntax. 該当のオブジェクトは、現在のコンテキスト、または複数のインデックス オブジェクトが含まれるプロパティの値です。The object in question can be either the current context or the value of a property that contains a multiple index object.

既定では、インデクサー値は、基になるオブジェクトの特性を使用して型指定されます。By default, the indexer values are typed by using the characteristics of the underlying object. 必要に応じて、インデックスの型を指定できます。You can specify the type of the index if necessary. インデクサーの入力の詳細についてBinding.Pathは、「」を参照してください。For details on typing the indexers, see Binding.Path.

構文の混合Mixing Syntaxes

上記の各構文は、混在させることができます。Each of the syntaxes shown above can be interspersed. たとえば、次に示すのは、オブジェクトのColorGrid SolidColorBrushピクセルグリッド配列を含むプロパティの特定の x、y にある色へのプロパティパスを作成する例です。For instance, the following is an example that creates a property path to the color at a particular x,y of a ColorGrid property that contains a pixel grid array of SolidColorBrush objects:

<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" .../>

プロパティ パス文字列のエスケープEscapes for Property Path Strings

特定のビジネス オブジェクトでは、正しく解析するために、プロパティ パス文字列にエスケープ シーケンスが必要な場合があります。For certain business objects, you might encounter a case where the property path string requires an escape sequence in order to parse correctly. このような文字の多くには、通常ビジネス オブジェクトを定義するために使用される言語において、名前付けの相互作用に関する同様の問題があるため、エスケープが必要になることはほとんどありません。The need to escape should be rare, because many of these characters have similar naming-interaction issues in languages that would typically be used to define the business object.

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

  • XML 言語定義で特別な意味を持つ特定の文字を (XML エンティティを使用して) エスケープする必要があります。You must 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 ">".

  • マークアップ拡張機能の処理に関する WPF XAML パーサーの動作で特別な意味を持つ文字を、(バックスラッシュ \ を使用して) エスケープする必要があります。You must escape (using backslash \) characters that are special to the WPF XAML parser behavior for processing a markup extension.

    • バックスラッシュ (\) は、それ自体がエスケープ文字です。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.

注意

厳密に言うと、これらのエスケープはストーリーボードのプロパティ パスに役立ちますが、通常は既存の WPF オブジェクトのオブジェクト モデルを走査するので、エスケープは不要です。Technically, these escapes work for a storyboard property path also, but you are usually traversing object models for existing WPF objects, and escaping should be unnecessary.

アニメーション ターゲットの PropertyPathPropertyPath for Animation Targets

アニメーションの target プロパティは、 Freezableまたはプリミティブ型のいずれかを受け取る依存関係プロパティである必要があります。The target property of an animation must be a dependency property that takes either a Freezable or a primitive type. ただし、型のターゲット プロパティと最終的なアニメーション プロパティは異なるオブジェクト上に存在できます。However, the targeted property on a type and the eventual animated property can exist on different objects. アニメーションの場合は、プロパティ パスを使用して、プロパティ値内のオブジェクトとプロパティのリレーションシップを走査することによって、名前付きのアニメーション ターゲット オブジェクトのプロパティと目的のターゲット アニメーション プロパティの間の接続が定義されます。For animations, a property path is used to define the connection between the named animation target object's property and the intended target animation property, by traversing object-property relationships in the property values.

アニメーションに関するオブジェクトとプロパティの一般的な注意事項General Object-Property Considerations for Animations

一般的なアニメーションの概念の詳細については、「ストーリーボードの概要」および「アニメーションの概要」を参照してください。For more information on animation concepts in general, see Storyboards Overview and Animation Overview.

アニメーション化する値の型またはプロパティは、 Freezable型またはプリミティブである必要があります。The value type or the property being animated must be either a Freezable type or a primitive. パスを開始するプロパティは、指定さTargetNameれた型に存在する依存関係プロパティの名前に解決される必要があります。The property that starts the path must resolve to be the name of a dependency property that exists on the specified TargetName type.

既に固定されているをFreezableアニメーション化するための複製をサポートするTargetNameFrameworkElementは、にFrameworkContentElementよって指定されたオブジェクトがまたは派生クラスである必要があります。In order to support cloning for animating a Freezable that is already frozen, the object specified by TargetName must be a FrameworkElement or FrameworkContentElement derived class.

ターゲット オブジェクト上の単一プロパティSingle Property on the Target Object

<animation Storyboard.TargetProperty="propertyName" .../>

propertyNameは、指定さTargetNameれた型に存在する依存関係プロパティの名前に解決される必要があります。propertyName must resolve to be the name of a dependency property that exists on the specified TargetName type.

間接的なプロパティのターゲット設定Indirect Property Targeting

<animation Storyboard.TargetProperty="propertyName.propertyName2" .../>

propertyNameは、 Freezable値型または指定されたTargetName型に存在するプリミティブであるプロパティである必要があります。propertyName must be a property that is either a Freezable value type or a primitive, which exists on the specified TargetName type.

propertyName2 は、propertyName の値であるオブジェクトに存在する依存関係プロパティの名前である必要があります。propertyName2 must be the name of a dependency property that exists on the object that is the value of propertyName. 言い換えると、 propertyName2は、である型propertyName PropertyTypeの依存関係プロパティとして存在する必要があります。In other words, propertyName2 must exist as a dependency property on the type that is the propertyName PropertyType.

適用されるスタイルとテンプレートにより、アニメーションの間接的なターゲット設定が必要です。Indirect targeting of animations is necessary because of applied styles and templates. アニメーションを対象とするには、ターゲットオブジェクトTargetNameにが必要です。この名前は、 x:NameまたはNameによって確立されます。In order to target an animation, you need a TargetName on a target object, and that name is established by x:Name or Name. テンプレート要素とスタイル要素にも名前を付けることができますが、これらの名前はスタイルとテンプレートの名前スコープ内でのみ有効です。Although template and style elements also can have names, those names are only valid within the namescope of the style and template. (テンプレートとスタイルで名前スコープがアプリケーションマークアップと共有された場合、名前を一意にすることはできません。(If templates and styles did share namescopes with application markup, names couldn't be unique. スタイルとテンプレートは、文字どおりインスタンス間で共有され、重複する名前が perpetuate ます。)このため、アニメーション化する要素の個々のプロパティがスタイルやテンプレートに基づく場合は、スタイル テンプレートに基づかない、名前付きの要素インスタンスで操作を開始し、スタイルまたはテンプレートのビジュアル ツリーに対象を移動し、アニメーション化する目的のプロパティにアクセスします。The styles and templates are literally shared between instances and would perpetuate duplicate names.) Thus, if the individual properties of an element that you might wish to animate came from a style or template, you need to start with a named element instance that is not from a style template, and then target into the style or template visual tree to arrive at the property you wish to animate.

たとえば、 Background BrushのプロパティSolidColorBrushは、テーマテンプレートに由来する完全な (実際は) です。 PanelFor instance, the Background property of a Panel is a complete Brush (actually a SolidColorBrush) that came from a theme template. Brush完全にアニメーション化するには、BrushAnimation (おそらくすべてBrushの型につき1つ) である必要があり、そのような型は存在しません。To animate a Brush completely, there would need to be a BrushAnimation (probably one for every Brush type) and there is no such type. ブラシをアニメーション化するには、代わりに特定Brushの型のプロパティをアニメーション化します。To animate a Brush, you instead animate properties of a particular Brush type. にを適用ColorするにSolidColorBrushColorAnimation 、からにアクセスする必要があります。You need to get from SolidColorBrush to its Color to apply a ColorAnimation there. この例のプロパティ パスは Background.Color です。The property path for this example would be Background.Color.

アタッチされるプロパティAttached Properties

<animation Storyboard.TargetProperty="(ownerType.propertyName)" .../>

かっこは、内のPropertyPathこのプロパティを部分修飾を使用して構築する必要があることを示しています。The parentheses indicate that this property in a PropertyPath should be constructed using a partial qualification. XML 名前空間を使用して型を検出できます。It can use an XML namespace to find the type. ownerType 、各アセンブリのXAMLXAML XmlnsDefinitionAttribute宣言を通じて、プロセッサがアクセスできる型を検索します。The ownerType searches types that a XAMLXAML processor has access to, through the XmlnsDefinitionAttribute declarations in each assembly. ほとんどのアプリケーションは、http://schemas.microsoft.com/winfx/2006/xaml/presentation 名前空間にマップされた既定の XML 名前空間を持ちます。そのため、プレフィックスは通常、カスタム型や、名前空間の外部の型に限って必要です。Most applications have the default XML namespace mapped to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace, so a prefix is usually only necessary for custom types or types otherwise outside that namespace. propertyName は、ownerType に存在するプロパティの名前に解決される必要があります。propertyName must resolve to be the name of a property existing on the ownerType. としてpropertyName指定されたDependencyPropertyプロパティは、である必要があります。The property specified as propertyName must be a DependencyProperty. 添付プロパティWPFWPFはすべて依存関係プロパティとして実装されているので、この問題はカスタム添付プロパティの場合にのみ問題になります。(All WPFWPF attached properties are implemented as dependency properties, so this issue is only of concern for custom attached properties.)

インデクサーIndexers

<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" .../>

ほとんどの依存関係Freezableプロパティまたは型はインデクサーをサポートしていません。Most dependency properties or Freezable types do not support an indexer. そのため、アニメーション パス内でインデクサーを使用するのは、名前付きターゲット上でチェーンを開始するプロパティと、最終的にアニメーション化されるプロパティの間の中間位置に限られます。Therefore, the only usage for an indexer in an animation path is at an intermediate position between the property that starts the chain on the named target and the eventual animated property. 提供される構文の中で、これは propertyName2 です。In the provided syntax, that is propertyName2. たとえば、中間プロパティがなどのプロパティパスTransformGroup RenderTransform.Children[1].Angleで、などのコレクションである場合、インデクサーの使用が必要になることがあります。For instance, an indexer usage might be necessary if the intermediate property is a collection such as TransformGroup, in a property path such as RenderTransform.Children[1].Angle.

コード内の PropertyPathPropertyPath in Code

PropertyPath PropertyPath構築方法を含むのコードの使用方法については、「」のリファレンストピックで説明されています。 PropertyPathCode usage for PropertyPath, including how to construct a PropertyPath, is documented in the reference topic for PropertyPath.

一般に、 PropertyPathは2つの異なるコンストラクターを使用するように設計されています。1つはバインディングの使用と最も単純なアニメーションの用途用、もう1つは複雑なアニメーションの使用用です。In general, PropertyPath is designed to use two different constructors, one for the binding usages and simplest animation usages, and one for the complex animation usages. バインディングの使用に署名を使用します。この場合、オブジェクトは文字列です。PropertyPath(Object)Use the PropertyPath(Object) signature for binding usages, where the object is a string. 1ステップのアニメーションパスでは、オブジェクトがであるとDependencyPropertyいう署名を使用します。PropertyPath(Object)Use the PropertyPath(Object) signature for one-step animation paths, where the object is a DependencyProperty. 複雑なPropertyPath(String, Object[])アニメーションの場合は、署名を使用します。Use the PropertyPath(String, Object[]) signature for complex animations. 後者のコンストラクターでは、先頭のパラメーター用のトークン文字列と、トークン文字列内の位置に設定されるオブジェクトの配列を使用して、プロパティ パスのリレーションシップを定義します。This latter constructor uses a token string for the first parameter and an array of objects that fill positions in the token string to define a property path relationship.

関連項目See also