PropertyPath オブジェクトは、PropertyPath型を値として受け取るさまざまなプロパティを設定するための複雑なインライン XAML 構文をサポートしています。 このトピックでは、バインド構文とアニメーション構文に適用される PropertyPath 構文について説明します。
PropertyPath が使用される場所
PropertyPath は、いくつかの Windows Presentation Foundation (WPF) 機能で使用される一般的なオブジェクトです。 共通の PropertyPath を使用してプロパティ パス情報を伝達するにもかかわらず、 PropertyPath が型として使用される各機能領域の使用方法は異なります。 そのため、機能ごとに構文を文書化する方が実用的です。
主に、WPF は PropertyPath を使用して、オブジェクト データ ソースのプロパティを走査するためのオブジェクト モデル パスを記述し、ターゲット アニメーションのターゲット パスを記述します。
Setter.Propertyなどの一部のスタイルおよびテンプレート プロパティは、PropertyPathに似た修飾プロパティ名を受け取ります。 ただし、これは真の PropertyPathではありません。代わりに、WPF XAML プロセッサによって有効にされる、修飾された owner.property 文字列形式の使用法であり、 DependencyPropertyの型コンバーターと組み合わせて使用されます。
データバインディングにおけるオブジェクトのプロパティパス
データ バインディングは、任意の依存関係プロパティのターゲット値にバインドできる WPF 機能です。 ただし、このようなデータ バインディングのソースは依存関係プロパティである必要はありません。これには、該当するデータ プロバイダーによって認識される任意のプロパティ型を指定できます。 プロパティ パスは、共通言語ランタイム (CLR) オブジェクトとそのプロパティからバインディング ソースを取得するために使用される、 ObjectDataProviderに特に使用されます。
XML へのデータ バインディングでは、PropertyPathでPathを使用しないため、Bindingは使用されないことに注意してください。 代わりに、 XPath を使用し、データの XML ドキュメント オブジェクト モデル (DOM) に有効な XPath 構文を指定します。 XPath は文字列としても指定されていますが、ここには記載されていません。 XMLDataProvider および XPath クエリを使用した XML データへのバインドを参照してください。
データ バインディングのプロパティ パスを理解するための重要な点は、バインドを個々のプロパティ値にターゲットにするか、代わりにリストまたはコレクションを受け取るターゲット プロパティにバインドできることです。 コレクションをバインドする場合(たとえば、コレクション内のデータ項目の数に応じて拡張される ListBox をバインドする場合、プロパティ パスは個々のコレクション項目ではなくコレクション オブジェクトを参照する必要があります。 データ バインディング エンジンは、データ ソースとして使用されるコレクションをバインディング ターゲットの型に自動的に照合し、結果として項目配列を ListBox に設定するなどの動作が発生します。
データ コンテキストとしての即時オブジェクトの単一プロパティ
<Binding Path="propertyName" ... />
propertyName は、DataContextの使用のために現在のPathにあるプロパティの名前に解決する必要があります。 バインディングによってソースが更新される場合、そのプロパティは読み取り/書き込みであり、ソース オブジェクトは変更可能である必要があります。
データ コンテキストとしてのイミディエイト オブジェクトの単一インデクサー
<Binding Path="[key]" ... />
key
は、ディクショナリまたはハッシュ テーブルに対する型指定されたインデックス、または配列の整数インデックスである必要があります。 また、キーの値は、適用されるプロパティに直接バインドできる型である必要があります。 たとえば、文字列キーと文字列値を含むハッシュ テーブルを使用して、 TextBoxの Text にバインドできます。 または、キーがコレクションまたはサブインデックスを指している場合は、この構文を使用してターゲット コレクション プロパティにバインドできます。 それ以外の場合は、 <Binding Path="[key].propertyName" .../>
などの構文を使用して、特定のプロパティを参照する必要があります。
必要に応じて、インデックスの種類を指定できます。 インデックス付きプロパティ パスのこの側面の詳細については、 Binding.Pathを参照してください。
複数のプロパティ(間接的なプロパティターゲティング)
<Binding Path="propertyName.propertyName2" ... />
propertyName
は、現在の DataContextであるプロパティの名前に解決する必要があります。
propertyName
およびpropertyName2
パス プロパティには、リレーションシップ内に存在する任意のプロパティを指定できます。propertyName2
は、propertyName
の値である型に存在するプロパティです。
単独プロパティ、添付済みまたはその他の形式 Type-Qualified
<object property="(ownerType.propertyName)" ... />
かっこは、 PropertyPath 内のこのプロパティを部分修飾を使用して構築する必要があることを示します。 XML 名前空間を使用して、適切なマッピングを持つ型を検索できます。
ownerType
は、各アセンブリのXmlnsDefinitionAttribute宣言を使用して、XAML プロセッサがアクセスできる型を検索します。 ほとんどのアプリケーションでは、既定の XML 名前空間が http://schemas.microsoft.com/winfx/2006/xaml/presentation
名前空間にマップされているため、通常、プレフィックスはカスタム型やその名前空間の外側にある型にのみ必要です。
propertyName
は、 ownerType
に存在するプロパティの名前に解決する必要があります。 この構文は、通常、次のいずれかの場合に使用されます。
パスは、指定されたターゲット型を持たないスタイルまたはテンプレート内にある XAML で指定されます。 非スタイルのテンプレート以外のケースでは、プロパティは型ではなくインスタンス上に存在するため、通常、これ以外の場合は、修飾された使用法は無効です。
プロパティは添付プロパティです。
静的プロパティにバインドしています。
ストーリーボードターゲットとして使用するには、 propertyName
として指定されたプロパティが DependencyPropertyである必要があります。
ソース トラバーサル (コレクションの階層へのバインド)
<object Path="propertyName/propertyNameX" ... />
この構文の / は、階層データ ソース オブジェクト内を移動するために使用され、連続する /文字を持つ階層への複数のステップがサポートされています。 ソース トラバーサルでは、現在のレコード ポインター位置が考慮されます。これは、データをビューの UI と同期することによって決定されます。 階層データ ソース オブジェクトを使用したバインドの詳細と、データ バインディングでの現在のレコード ポインターの概念については、「階層データでの Master-Detail パターンの使用 」または「 データ バインディングの概要」を参照してください。
注
表面的には、この構文は XPath に似ています。 XML データ ソースにバインドするための真の XPath 式は、 Path 値として使用されず、代わりに相互に排他的な XPath プロパティに使用する必要があります。
コレクション ビュー
名前付きコレクション ビューを参照するには、コレクション ビュー名の先頭にハッシュ文字 (#
) を付けます。
現在のレコード ポインター
コレクション ビューまたはマスター詳細データ バインディング シナリオの現在のレコード ポインターを参照するには、スラッシュ (/
) でパス文字列を開始します。 スラッシュ以降のパスは、現在のレコードポインタから開始して辿られます。
複数のインデクサー
<object Path="[index1,index2...]" ... />
又は
<object Path="propertyName[index,index2...]" ... />
特定のオブジェクトが複数のインデクサーをサポートしている場合は、配列参照構文と同様に、これらのインデクサーを順番に指定できます。 対象のオブジェクトは、現在のコンテキストか、複数のインデックス オブジェクトを含むプロパティの値のいずれかです。
既定では、インデクサー値は、基になるオブジェクトの特性を使用して型指定されます。 必要に応じて、インデックスの種類を指定できます。 インデクサーの入力の詳細については、 Binding.Pathを参照してください。
構文の混在
上記の各構文は、混在させることができます。 たとえば、次の例では、ColorGrid
オブジェクトのピクセル グリッド配列を含むSolidColorBrush プロパティの特定の x,y の色へのプロパティ パスを作成します。
<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" ... />
プロパティ パス文字列のエスケープ処理
特定のビジネス オブジェクトでは、正しく解析するためにプロパティ パス文字列にエスケープ シーケンスが必要な場合があります。 これらの文字の多くは、通常、ビジネス オブジェクトの定義に使用される言語で同様の名前付け操作の問題があるため、エスケープの必要性はまれです。
インデクサー ([ ]) 内では、キャレット文字 (^) は次の文字をエスケープします。
XML 言語定義に特殊な特定の文字をエスケープする (XML エンティティを使用する) 必要があります。
を使用して文字 "&" をエスケープします。 終了タグ " >
" をエスケープするには、>を使用します。マークアップ拡張機能を処理するには、WPF XAML パーサーの動作に特別な文字をエスケープする (円記号
\
を使用する) 必要があります。バックスラッシュ (
\
) はエスケープ文字自体です。等号 (
=
) は、プロパティ名とプロパティ値を区切ります。コンマ (
,
) はプロパティを区切ります。右中かっこ (
}
) は、マークアップ拡張の末尾です。
注
技術的には、これらのエスケープはストーリーボードのプロパティ パスでも機能しますが、通常は既存の WPF オブジェクトのオブジェクト モデルを走査するため、エスケープは不要です。
アニメーションターゲットのプロパティパス
アニメーションのターゲット プロパティは、 Freezable またはプリミティブ型を受け取る依存関係プロパティである必要があります。 ただし、型のターゲット プロパティと最終的にアニメーション化されたプロパティは、異なるオブジェクトに存在できます。 アニメーションの場合、プロパティ パスを使用して、名前付きアニメーション ターゲット オブジェクトのプロパティと目的のターゲット アニメーション プロパティの間の接続を定義します。これは、プロパティ値内のオブジェクト とプロパティのリレーションシップを走査することによって行われます。
アニメーションの一般的な Object-Property に関する考慮事項
アニメーションの概念全般の詳細については、「 ストーリーボードの概要 」と「 アニメーションの概要」を参照してください。
アニメーション化する値の型またはプロパティは、 Freezable 型またはプリミティブである必要があります。 パスを開始するプロパティは、指定した TargetName 型に存在する依存関係プロパティの名前に解決する必要があります。
既に固定されている Freezable をアニメーション化するための複製をサポートするには、 TargetName によって指定されたオブジェクトが FrameworkElement または派生クラス FrameworkContentElement 必要があります。
ターゲット オブジェクトの単一プロパティ
<animation Storyboard.TargetProperty="propertyName" ... />
propertyName
は、指定した TargetName 型に存在する依存関係プロパティの名前に解決する必要があります。
間接プロパティのターゲット設定
<animation Storyboard.TargetProperty="propertyName.propertyName2" ... />
propertyName
は、指定したFreezable型に存在するTargetName値型またはプリミティブのプロパティである必要があります。
propertyName2
は、 propertyName
の値であるオブジェクトに存在する依存関係プロパティの名前である必要があります。 つまり、 propertyName2
は、 propertyName
PropertyTypeである型の依存関係プロパティとして存在する必要があります。
アニメーションの間接的なターゲット設定は、適用されたスタイルとテンプレートのために必要です。 アニメーションをターゲットにするには、ターゲット オブジェクトに TargetName が必要であり、その名前は x:Name または Name によって確立されます。 テンプレート要素とスタイル要素には名前を付けることもできますが、これらの名前はスタイルとテンプレートの名前スコープ内でのみ有効です。 (テンプレートとスタイルがアプリケーション マークアップと名前スコープを共有している場合、名前を一意にすることはできません。スタイルとテンプレートは、インスタンス間で文字どおり共有され、重複する名前が永続します)。したがって、アニメーション化する要素の個々のプロパティがスタイルまたはテンプレートから取得された場合は、スタイル テンプレート以外の名前付き要素インスタンスから開始し、スタイルまたはテンプレートのビジュアル ツリーをターゲットにして、アニメーション化するプロパティに到達する必要があります。
たとえば、BackgroundのPanel プロパティは、テーマ テンプレートから取得された完全なBrush (実際にはSolidColorBrush) です。
Brushを完全にアニメーション化するには、BrushAnimation (おそらくBrushの種類ごとに 1 つ) が必要であり、そのような型はありません。 ブラシをアニメーション化するには、代わりに特定の Brush 型のプロパティをアニメーション化します。
SolidColorBrushを適用するには、ColorからColorAnimationに移動する必要があります。 この例のプロパティ パスは Background.Color
。
添付プロパティ
<animation Storyboard.TargetProperty="(ownerType.propertyName)" ... />
かっこは、 PropertyPath 内のこのプロパティを部分修飾を使用して構築する必要があることを示します。 XML 名前空間を使用して型を検索できます。
ownerType
は、各アセンブリのXmlnsDefinitionAttribute宣言を使用して、XAML プロセッサがアクセスできる型を検索します。 ほとんどのアプリケーションでは、既定の XML 名前空間が http://schemas.microsoft.com/winfx/2006/xaml/presentation
名前空間にマップされているため、通常、プレフィックスはカスタム型やその名前空間の外側にある型にのみ必要です。
propertyName
は、 ownerType
に存在するプロパティの名前に解決する必要があります。
propertyName
として指定するプロパティは、DependencyPropertyである必要があります。 (すべての WPF 添付プロパティは依存関係プロパティとして実装されるため、この問題はカスタム添付プロパティにのみ関係します)。
インデクサー
<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" ... />
ほとんどの依存関係プロパティまたは Freezable 型は、インデクサーをサポートしていません。 そのため、アニメーション パス内のインデクサーの唯一の使用法は、名前付きターゲットのチェーンを開始するプロパティと最終的にアニメーション化されたプロパティの間の中間位置にあります。 指定された構文では、 propertyName2
。 たとえば、中間プロパティが TransformGroup などのプロパティ パス内の RenderTransform.Children[1].Angle
などのコレクションである場合、インデクサーの使用が必要になる場合があります。
コード内のプロパティパス
PropertyPathの作成方法など、PropertyPathのコードの使用方法については、PropertyPathのリファレンス トピックを参照してください。
一般に、 PropertyPath は 2 つの異なるコンストラクターを使用するように設計されています。1 つはバインディングの使用法と最も単純なアニメーションの使用用で、1 つは複雑なアニメーションの使用用です。 バインドの使用法には PropertyPath(Object) 署名を使用します。この場合、オブジェクトは文字列です。 オブジェクトがPropertyPath(Object)である 1 ステップ アニメーション パスには、DependencyPropertyシグネチャを使用します。 複雑なアニメーションには、 PropertyPath(String, Object[]) 署名を使用します。 この後者のコンストラクターは、最初のパラメーターにトークン文字列を使用し、トークン文字列内の位置を埋めるオブジェクトの配列を使用して、プロパティ パスのリレーションシップを定義します。
こちらも参照ください
.NET Desktop feedback