PropertyPath クラスと文字列構文を使用して、XAML またはコードで PropertyPath 値をインスタンス化できます。 PropertyPath 値は、データ バインディングによって使用されます。 ストーリーボードに設定されたアニメーションをターゲットに設定する場合にも同様の構文が使用されます。 どちらのシナリオでも、プロパティ パスは、最終的に 1 つのプロパティに解決される 1 つ以上のオブジェクト とプロパティのリレーションシップのトラバーサルを記述します。
プロパティ パス文字列は、XAML で属性に直接設定できます。 同じ文字列構文を使用して、コード内のバインドを設定する PropertyPath を構築したり、SetTargetProperty を使用してコードでアニメーション ターゲットを設定したりできます。 Windows ランタイムには、プロパティ パスを使用する 2 つの異なる機能領域 (データ バインディングとアニメーション のターゲット設定) があります。 アニメーション のターゲット設定では、Windows ランタイム実装で基になるプロパティ パス構文値は作成されません。情報は文字列として保持されますが、オブジェクト プロパティトラバーサルの概念は非常に似ています。 データ バインディングと各ターゲットアニメーションは、プロパティ パスを少し異なる方法で評価するため、プロパティ パスの構文について個別に説明します。
データ バインディング内のオブジェクトのプロパティ パス
Windows ランタイムでは、任意の依存関係プロパティのターゲット値にバインドできます。 データ バインディングのソース プロパティ値は、依存関係プロパティである必要はありません。ビジネス オブジェクトのプロパティを指定できます (たとえば、Microsoft .NET 言語または C++ で記述されたクラス)。 または、バインド値のソース オブジェクトには、アプリによって既に定義されている既存の依存関係オブジェクトを指定できます。 ソースは、単純なプロパティ名、またはビジネス オブジェクトのオブジェクト グラフ内のオブジェクト とプロパティのリレーションシップのトラバーサルによって参照できます。
個々のプロパティ値にバインドすることも、リストまたはコレクションを保持するターゲット プロパティにバインドすることもできます。 ソースがコレクションの場合、またはパスでコレクション プロパティが指定されている場合、データ バインディング エンジンはソースのコレクション項目をバインディング ターゲットと照合します。その結果、そのコレクション内の特定の項目を予測することなく、データ ソース コレクションの項目のリストを ListBox に設定するなどの動作が発生します。
オブジェクト グラフの走査
オブジェクト グラフ内のオブジェクト プロパティリレーションシップのトラバーサルを示す構文の要素は、ドット (.) 文字です。 プロパティ パス文字列内の各ドットは、オブジェクト (ドットの左側) とそのオブジェクトのプロパティ (ドットの右側) の間の除算を示します。 文字列は左から右に評価され、複数のオブジェクトとプロパティの関係を順に処理できます。 例を見てみましょう。
"{Binding Path=Customer.Address.StreetAddress1}"
このパスの評価方法を次に示します。
- データ コンテキスト オブジェクト (または同じバインディングで指定されたソース) は、"Customer" という名前のプロパティを検索します。
- "Customer" プロパティの値としてのオブジェクトが、"Address" という名前のプロパティを検索します。
- "Address" プロパティの値であるオブジェクトは、"StreetAddress1" という名前のプロパティを検索します。
これらの各手順では、値はオブジェクトとして扱われます。 結果の型は、バインディングが特定のプロパティに適用されている場合にのみチェックされます。 この例は、"Address" が、文字列のどの部分が番地であるかを公開していない文字列値に過ぎない場合に失敗します。 通常、バインディングは、既知の意図的な情報構造を持つビジネス オブジェクトの特定の入れ子になったプロパティ値を指しています。
データ バインディング プロパティ パス内のプロパティの規則
- プロパティ パスによって参照されるすべてのプロパティは、ソース ビジネス オブジェクトでパブリックである必要があります。
- end プロパティ (パス内の最後の名前付きプロパティであるプロパティ) はパブリックである必要があり、変更可能である必要があります。静的な値にバインドすることはできません。
- このパスが双方向バインディングの Path 情報として使用される場合、end プロパティは読み取り/書き込みである必要があります。
インデクサー
データ バインディングのプロパティ パスには、インデックス付きプロパティへの参照を含めることができます。 これにより、順序付けられたリスト/ベクター、またはディクショナリ/マップへのバインドが可能になります。 インデックス付きプロパティを示すには、角かっこ "[]" 文字を使用します。 これらの角かっこの内容は、整数 (順序付きリストの場合) または引用符で囲まれていない文字列 (ディクショナリの場合) のいずれかです。 キーが整数であるディクショナリにバインドすることもできます。 同じパスで異なるインデックス付きプロパティを使用し、オブジェクト プロパティをドットで区切ることができます。
たとえば、"Teams" (順序付きリスト) のリストがあるビジネス オブジェクトについて考えてみます。それぞれのリストには、各プレイヤーが姓でキーを設定する "Players" の辞書があります。 2 番目のチームの特定のプレイヤーへのプロパティ パスの例は、"Teams[1] です。Players[Smith]". (リストのインデックスが 0 であるため、1 を使用して "Teams" の 2 番目の項目を示します)。
注
C++ データ ソースのインデックス作成のサポートは制限されています。詳細については、「 データ バインディングの詳細」を参照してください。
添付プロパティ
プロパティ パスには、添付プロパティへの参照を含めることができます。 添付プロパティの識別名には既にドットが含まれているため、ドットがオブジェクト プロパティ ステップとして扱われないように、添付プロパティ名をかっこで囲む必要があります。 たとえば、バインディング パスとして Canvas.ZIndex を使用することを指定する文字列は "(Canvas.ZIndex)" です。 添付プロパティの詳細については、「添付プロパティ の概要」を参照してください。
プロパティパス構文の組み合わせ
プロパティ パス構文のさまざまな要素を 1 つの文字列に結合できます。 たとえば、データ ソースにそのようなプロパティがある場合は、インデックス付き添付プロパティを参照するプロパティ パスを定義できます。
バインド プロパティ パスのデバッグ
プロパティ パスはバインド エンジンによって解釈され、実行時にのみ存在する可能性がある情報に依存するため、多くの場合、開発ツールでの従来のデザイン時またはコンパイル時のサポートに依存することなく、バインドのプロパティ パスをデバッグする必要があります。 多くの場合、プロパティ パスの解決に失敗した実行時の結果は、バインド解決の仕様フォールバック動作であるため、エラーのない空白の値になります。 幸いなことに、Microsoft Visual Studio にはデバッグ出力モードが用意されています。このモードでは、バインド ソースを指定しているプロパティ パスのどの部分を解決できなかったかを分離できます。 この開発ツール機能の使用方法の詳細については、「 データ バインディングの詳細」の「デバッグ」セクションを参照してください。
アニメーションターゲット用プロパティパス
アニメーションは、アニメーションの実行時にストーリーボードに設定された値が適用される依存関係プロパティを対象にしています。 アニメーション化するプロパティが存在するオブジェクトを識別するために、アニメーションは要素を名前 (x:Name 属性) で対象とします。 多くの場合、 Storyboard.TargetName として識別されるオブジェクトで始まり、アニメーションを適用する必要がある特定の依存関係プロパティ値で終わるプロパティ パスを定義する必要があります。 このプロパティ パスは、 Storyboard.TargetProperty の値として使用されます。
XAML でアニメーションを定義する方法の詳細については、「 ストーリーボードに設定されたアニメーション」を参照してください。
単純なターゲット設定
対象オブジェクト自体に存在するプロパティをアニメーション化していて、そのプロパティの型にアニメーションを直接適用できる場合は (プロパティの値のサブプロパティではなく)、アニメーション化するプロパティに追加の修飾なしで名前を付けることができます。 たとえば、Rectangle などの Shape サブクラスをターゲットにしていて、アニメーション化された Color を Fill プロパティに適用する場合、プロパティ パスは "Fill" にすることができます。
間接プロパティのターゲット設定
ターゲット オブジェクトのサブプロパティであるプロパティをアニメーション化できます。 つまり、オブジェクト自体であるターゲット オブジェクトのプロパティがあり、そのオブジェクトにプロパティがある場合は、そのオブジェクトとプロパティの関係をステップ実行する方法を説明するプロパティ パスを定義する必要があります。 サブプロパティをアニメーション化するオブジェクトを指定するときは常に、プロパティ名をかっこで囲み、 typename でプロパティを指定します。propertyname 形式。 たとえば、ターゲット オブジェクトの RenderTransform プロパティのオブジェクト値を指定するには、プロパティ パスの最初の手順として "(UIElement.RenderTransform)" を指定します。 Transform 値に直接適用できるアニメーションがないため、これはまだ完全なパスではありません。 したがって、この例では、プロパティ パスを完成させて、終了プロパティが Double 値 "(UIElement.RenderTransform) でアニメーション化できる Transform サブクラスのプロパティになるようにします。(CompositeTransform.TranslateX)"
コレクション内の特定の子を指定する
コレクション プロパティで子項目を指定するには、数値インデクサーを使用できます。 整数インデックス値の周囲に角かっこ "[]" 文字を使用します。 辞書ではなく、順序付きリストのみを参照できます。 コレクションはアニメーション化できる値ではないので、インデクサーの使用をプロパティ パスの終了プロパティにすることはできません。
たとえば、コントロールの Background プロパティに適用される LinearGradientBrush で最初の色の停止色をアニメーション化することを指定するには、プロパティ パス "(Control.Background) です。(GradientBrush.GradientStops)[0].(GradientStop.Color)"。 インデクサーがパスの最後のステップではなく、最後のステップで Color アニメーション値を適用するには、コレクション内の項目 0 の GradientStop.Color プロパティを特に参照する必要があることに注意してください。
添付プロパティのアニメーション化
これは一般的なシナリオではありませんが、添付プロパティにアニメーションの種類に一致するプロパティ値がある限り、添付プロパティをアニメーション化できます。 添付プロパティの識別名には既にドットが含まれているため、ドットがオブジェクト プロパティ ステップとして扱われないように、添付プロパティ名をかっこで囲む必要があります。 たとえば、オブジェクトの Grid.Row 添付プロパティをアニメーション化することを指定する文字列は、プロパティ パス "(Grid.Row)" を使用します。
注
この例では、 Grid.Row の値は Int32 プロパティ型です。 そのため、Double アニメーションではアニメーション化できません。 代わりに、DiscreteObjectKeyFrame コンポーネントを持つ ObjectAnimationUsingKeyFrames を定義します。ObjectKeyFrame.Value は、"0" や "1" などの整数に設定されます。
アニメーションのプロパティ パスをターゲットにした場合のプロパティのルール
- プロパティ パスの開始点は、 Storyboard.TargetName によって識別されるオブジェクトです。
- プロパティ パスに沿って参照されるすべてのオブジェクトとプロパティはパブリックである必要があります。
- end プロパティ (パス内の最後の名前付きプロパティであるプロパティ) は、パブリックで、読み取り/書き込み可能で、依存関係プロパティである必要があります。
- end プロパティには、アニメーションの種類 (カラー アニメーション、 ダブル アニメーション、 ポイント アニメーション、 ObjectAnimationUsingKeyFrames) のいずれかの広範なクラスでアニメーション化できるプロパティ型が必要です。
PropertyPath クラス
PropertyPath クラスは、バインディング シナリオの Binding.Path の基になるプロパティ型です。
ほとんどの場合、コードをまったく使用せずに、XAML で PropertyPath を適用できます。 ただし、場合によっては、コードを使用して PropertyPath オブジェクトを定義し、実行時にプロパティに割り当てることができます。
PropertyPath には PropertyPath(String) コンストラクターがあり、既定のコンストラクターはありません。 このコンストラクターに渡す文字列は、前に説明したように、プロパティ パス構文を使用して定義された文字列です。 これは、 パス を XAML 属性として割り当てるために使用する文字列と同じです。 PropertyPath クラスの他の API は、読み取り専用の Path プロパティのみです。 このプロパティは、別の PropertyPath インスタンスの構築文字列として使用できます。
関連トピック
Windows developer