Auf Englisch lesen

Freigeben über


XAML-Syntax von PropertyPath

Aktualisiert: November 2007

Das PropertyPath-Objekt unterstützt eine komplexe XAML-Inlinesyntax, mit der verschiedene Eigenschaften festgelegt werden können, die den PropertyPath-Typ als Wert verwenden. In diesem Thema wird die PropertyPath-Syntax und deren Anwendung auf Bindungs- und Animationssyntax dargestellt.

Dieses Thema enthält folgende Abschnitte.

  • Verwendung von PropertyPath
  • PropertyPath für Objekte in einer Datenbindung
  • PropertyPath für Animationsziele
  • PropertyPath im Code
  • Verwandte Abschnitte

Verwendung von PropertyPath

PropertyPath ist ein allgemeines Objekt, das in verschiedenen Windows Presentation Foundation (WPF)-Features verwendet wird. Das allgemeine PropertyPath-Objekt wird zum Vermitteln von Informationen zu dem Eigenschaftenpfad genutzt. Die Verwendung in den einzelnen Featurebereichen, in denen PropertyPath als Typ eingesetzt wird, variiert jedoch. Die Syntax wird daher nach Features unterteilt dokumentiert.

WPF verwendet PropertyPath hauptsächlich, um Objektmodellpfade zum Traversieren der Eigenschaften einer Objektdatenquelle anzugeben und um den Zielpfad für zielgerichtete Animationen anzugeben.

Einige Format- und Vorlageneigenschaften, z. B. Setter.Property, haben einen qualifizierten Eigenschaftennamen, der auf den ersten Blick einem PropertyPath ähnelt. Hierbei handelt es sich jedoch nicht um einen echten PropertyPath, sondern um eine qualifizierte Verwendung des Besitzer.Eigenschaft-Zeichenfolgeformats, das vom XAML-Prozessor in Kombination mit dem Typkonverter für DependencyProperty aktiviert wird.

PropertyPath für Objekte in einer Datenbindung

Die Datenbindung ist ein WPF-Feature, durch das Sie eine Bindung zu dem Zielwert einer beliebigen Abhängigkeitseigenschaft herstellen können. Die Quelle einer solchen Datenbindung muss jedoch keine Abhängigkeitseigenschaft sein. Es kann sich auch um einen anderen Eigenschaftentyp handeln, der vom Anwendungsdatenanbieter erkannt wird. Eigenschaftenpfade werden vor allem für den ObjectDataProvider verwendet, der zum Abrufen von Bindungsquellen aus common language runtime (CLR)-Objekten und von zugehörigen Eigenschaften genutzt wird.

Beachten Sie, dass die Datenbindung mit XML PropertyPath nicht verwendet, da Path in Binding nicht genutzt wird. Verwenden Sie stattdessen XPath, und geben Sie eine gültige XPath-Syntax im XML-Dokumentobjektmodell (DOM) der Daten an. XPath wird ebenfalls als Zeichenfolge angegeben, wird hier jedoch nicht dokumentiert (siehe Gewusst wie: Binden an XML-Daten mithilfe von XMLDataProvider und XPath-Abfragen).

Um Eigenschaftenpfade in der Datenbindung zu verstehen, müssen Sie wissen, dass Sie einen individuellen Eigenschaftenwert als Ziel für die Bindung festlegen können. Alternativ können Sie eine Bindung zu Zieleigenschaften herstellen, die Listen oder Auflistungen übernehmen. Wenn Sie Auflistungen binden, muss der Eigenschaftenpfad anstatt auf einzelne Auflistungselemente auf eine gesamte Auflistung verweisen. Das Datenbindungsmodul ordnet die Auflistungen der Quelle automatisch dem Ziel zu und hat ein ähnliches Verhalten wie beim Eingeben eines Elementarrays in ein ListBox zur Folge.

Einzelne Eigenschaft auf dem unmittelbaren Objekt als Datenkontext

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

propertyName muss in den Namen einer Eigenschaft aufgelöst werden, die im aktuellen DataContext für eine Path-Verwendung enthalten ist. Wenn die Bindung die Quelle aktualisiert, müssen für diese Eigenschaft Schreib- und Leseberechtigungen festgelegt sein, und das Quellobjekt muss geändert werden können.

Einzelner Indexer auf dem unmittelbaren Objekt als Datenkontext

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

key muss der eingegebene Index zu einem Wörterbuch oder einer Hashtabelle oder der ganzzahlige Index eines Arrays sein. Zudem muss der Wert des Schlüssels einem Typ entsprechen, der direkt an die Eigenschaft, auf die er angewendet wird, gebunden werden kann. Eine Hashtabelle mit Zeichenfolgenschlüsseln und Zeichenfolgenwerten kann beispielsweise auf diese Art verwendet werden, um eine Bindung zu Text für ein TextBox herzustellen. Verweist der Schlüssel auf eine Auflistung oder einen Unterindex, können Sie mit dieser Syntax eine Bindung zu einer Zielauflistungseigenschaft herstellen. Andernfalls müssen Sie mithilfe einer Syntax wie <Binding Path="[key].propertyName" .../> auf eine bestimmte Eigenschaft verweisen.

Sie können bei Bedarf den Typ des Indexes angeben. Weitere Informationen zu diesem Aspekt eines indizierten Eigenschaftenpfads finden Sie unter Binding.Path.

Mehrere Eigenschaften (indirekte Eigenschaftenverwendung)

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

propertyName muss in den Namen einer Eigenschaft aufgelöst werden, die dem aktuellen DataContext entspricht. Für die Pfadeigenschaften propertyName und propertyName2 können alle Eigenschaften in einer Beziehung verwendet werden, wobei propertyName2 eine Eigenschaft in dem Typ ist, der dem Wert von propertyName entspricht.

Einzelne Eigenschaft, aus XAML-Lade-Namescope, Laufzeitreflektion

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

Diese Syntax wird ausschließlich für den Quellpfad einer Datenbindung zu einer CLR-Eigenschaft verwendet, und es muss sich um einen Pfad mit einem einzelnen Schritt in Eigenschaften handeln. propertyName muss in den Namen einer Eigenschaft aufgelöst werden, die für den ownerType vorhanden ist. ownerType entspricht normalerweise dem Typ, der basierend auf der Laufzeitreflektion gefunden werden kann. Es ist daher nicht zulässig, ownerType mit einem XML-Namespace-Präfix zu qualifizieren, da ein solches Präfix für die Reflektion bedeutungslos ist und nur von XAML beim Kompilieren verwendet wird. Siehe nächster Abschnitt.

Einzelne Eigenschaft, angefügt oder auf Kontext durch Format/Vorlage wartend

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

Die Klammern kennzeichnen, dass diese Eigenschaft in einem PropertyPath mit einer Teilqualifikation erstellt werden sollte. Es kann ein XML-Namespace verwendet werden, um den Typ zu suchen. Der ownerType sucht Typen, auf die ein XAML-Prozessor zugreifen kann, mithilfe der XmlnsDefinitionAttribute-Deklarationen in jeder Assembly. In den meisten Anwendungen ist dem https://schemas.microsoft.com/winfx/2006/xaml/presentation-Namespace ein standardmäßiger XML-Namespace zugeordnet. Ein Präfix ist daher normalerweise nur für benutzerdefinierte Typen oder andere Typen erforderlich, die sich andernfalls außerhalb dieses Namespace befinden würden. propertyName muss in den Namen einer Eigenschaft aufgelöst werden, die im ownerType vorhanden ist. Diese Syntax wird zumeist in einem der folgenden Fälle verwendet:

  • Dieser Pfad wird in XAML angegeben, d. h. in einem Format oder einer Vorlage, die keinen spezifischen Zieltyp aufweist. Eine qualifizierte Verwendung ist normalerweise in anderen Fällen als diesem nicht zulässig, da in Fällen ohne Format bzw. Vorlage die Eigenschaft in einer Instanz anstatt in einem Typ enthalten ist.

  • Die Eigenschaft ist eine angefügte Eigenschaft.

  • Sie binden an eine statische Eigenschaft. In diesem Fall ist ownerType tatsächlich ein Typ.

Für die Verwendung als Storyboardziel muss die als propertyName angegebene Eigenschaft eine DependencyProperty sein.

Quellentraversal (Binden an Auflistungshierarchien)

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

Das Zeichen / in dieser Syntax ermöglicht die Navigation in einem hierarchischen Datenquellenobjekt. In der Hierarchie werden mehrere Schritte mit aufeinander folgenden Schrägstrichen (/) unterstützt. Das Quellentraversal kennzeichnet die Zeigerposition des aktuellen Datensatzes, welche durch die Synchronisation der Daten mit der Benutzeroberfläche der Ansicht ermittelt wird. Weitere Informationen zum Binden mit hierarchischen Datenquellenobjekten und zu der Bedeutung des Zeigers für den aktuellen Datensatz in der Datenbindung finden Sie unter Gewusst wie: Verwenden des Master/Detail-Musters mit hierarchischen Daten oder Übersicht über Datenbindung.

Tipp

Auf den ersten Blick ähnelt diese Syntax XPath. Ein echter XPath-Ausdruck für das Binden an eine XML-Datenquelle wird jedoch nicht als Path-Wert verwendet. Er sollte stattdessen für die sich ausschließende XPath-Eigenschaft verwendet werden.

Mehrere Indexer

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

Wenn ein bestimmtes Objekt mehrere Indexer unterstützt, können diese in der richtigen Reihenfolge angegeben werden, ähnlich wie ein auf Syntax verweisendes Array. Bei dem betreffenden Objekt handelt es sich entweder um den aktuellen Kontext oder um den Wert einer Eigenschaft, die ein Objekt mit mehreren Indizes enthält.

Standardmäßig werden die Indexerwerte eingegeben, indem die Eigenschaften des zugrunde liegenden Objekts verwendet werden. Sie können bei Bedarf den Typ des Indexes angeben. Weitere Informationen zum Eingeben der Indexer finden Sie unter Binding.Path.

Kombinieren von Syntax

Jede oben angegebene Syntax kann mit anderer Syntax kombiniert werden. Im folgenden Beispiel wird beispielsweise ein Eigenschaftenpfad zu der Farbe an einem bestimmten XY-Punkt einer ColorGrid-Eigenschaft erstellt, die ein Pixelrasterarray von SolidColorBrush-Objekten enthält:

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

PropertyPath für Animationsziele

Die Zieleigenschaft einer Animation muss eine Abhängigkeitseigenschaft sein, die einen Freezable-Typ oder einen primitiven Typ aufweist. Die Zieleigenschaft für einen Typ und die ggf. animierte Eigenschaft können sich jedoch auf unterschiedlichen Objekten befinden. Bei Animationen wird ein Eigenschaftenpfad verwendet, um die Verbindung zwischen der Eigenschaft des benannten Animationszielobjekts und der Eigenschaft der gewünschten Zielanimation zu definieren. Hierzu werden die Objekt-/Eigenschaftenbeziehungen in den Eigenschaftenwerten durchlaufen.

Allgemeine Überlegungen zu Objekten/Eigenschaften für Animationen

Weitere Informationen zu Animationskonzepten im Allgemeinen finden Sie unter Übersicht über Storyboards und Übersicht über Animationen.

Der Werttyp oder die animierte Eigenschaft muss ein Freezable-Typ oder primitiver Typ sein. Die Eigenschaft, die den Pfad beginnt, muss in den Namen einer Abhängigkeitseigenschaft aufgelöst werden, die in dem angegebenen TargetName-Typ vorhanden ist.

Um das Klonen für die Animation eines Freezable-Typs zu unterstützen, der bereits gesperrt ist, muss das durch TargetName angegebene Objekt eine abgeleitete FrameworkElement- oder FrameworkContentElement-Klasse sein.

Einzelne Eigenschaft auf dem Zielobjekt

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

propertyName muss in den Namen einer Abhängigkeitseigenschaft aufgelöst werden, die in dem angegebenen TargetName-Typ vorhanden ist.

Indirekte Eigenschaftenverwendung

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

propertyName muss eine Eigenschaft sein, die entweder ein Freezable-Werttyp oder ein primitiver Werttyp ist, der in dem angegebenen TargetName-Typ vorhanden ist.

propertyName2 muss dem Namen einer Abhängigkeitseigenschaft entsprechen, die in dem Objekt vorhanden ist, das den Wert von propertyName angibt. Mit anderen Worten, propertyName2 muss als Abhängigkeitseigenschaft des Typs vorhanden sein, der den propertyNamePropertyType kennzeichnet.

Die indirekte Verwendung von Animationen ist aufgrund der angewendeten Formate und Vorlagen erforderlich. Um eine Animation zu verwenden, benötigen Sie einen TargetName auf einem Zielobjekt. Dieser Name wird durch x:Name oder Name festgelegt. Vorlagen- und Formatelemente können zwar ebenfalls Namen aufweisen, diese sind jedoch nur innerhalb des Namescope für das Format bzw. die Vorlage gültig. (Wenn Vorlagen und Formate den gleichen Namescope wie Anwendungsmarkup verwenden würden, wären die Namen nicht eindeutig. Die Formate und Vorlagen würden dann von verschiedenen Instanzen gleichzeitig verwendet und doppelte Namen weitergeben.) Wenn die spezifischen Eigenschaften eines zu animierenden Elements aus einem Format oder einer Vorlage stammen, müssen Sie daher mit einer benannten Elementinstanz beginnen, die nicht aus der Formatvorlage stammt. Geben Sie dann als Ziel die visuelle Struktur des Formats oder der Vorlage an, um die Eigenschaft zu kennzeichnen, die Sie animieren möchten.

Beispiel: Die Background-Eigenschaft eines Panel ist ein vollständiger Brush (um genau zu sein ein SolidColorBrush), der aus einer Designvorlage stammt. Um einen Brush vollständig zu animieren, benötigen Sie eine BrushAnimation (zumeist eine für jeden Brush-Typ), ein solcher Typ ist jedoch nicht vorhanden. Sie animieren daher statt des Pinsels die Eigenschaften eines bestimmten Brush-Typs. Sie müssen von dem SolidColorBrush zu der entsprechenden Color gelangen, um auf diese eine ColorAnimation anzuwenden. Der Eigenschaftenpfad für dieses Beispiel wäre Background.Color.

Angefügte Eigenschaften

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

Die Klammern kennzeichnen, dass diese Eigenschaft in einem PropertyPath mit einer Teilqualifikation erstellt werden sollte. Es kann ein XML-Namespace verwendet werden, um den Typ zu suchen. Der ownerType sucht Typen, auf die ein XAML-Prozessor zugreifen kann, mithilfe der XmlnsDefinitionAttribute-Deklarationen in jeder Assembly. In den meisten Anwendungen ist dem https://schemas.microsoft.com/winfx/2006/xaml/presentation-Namespace ein standardmäßiger XML-Namespace zugeordnet. Ein Präfix ist daher normalerweise nur für benutzerdefinierte Typen oder andere Typen erforderlich, die sich andernfalls außerhalb dieses Namespace befinden würden. propertyName muss in den Namen einer Eigenschaft aufgelöst werden, die im ownerType vorhanden ist. Die als propertyName angegebene Eigenschaft muss eine DependencyProperty sein. (Alle angefügten Eigenschaften in WPF werden als Abhängigkeitseigenschaften implementiert. Diese Frage ist daher nur für benutzerdefinierte, angefügte Eigenschaften relevant.)

Indexer

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

Die meisten Abhängigkeitseigenschaften oder Freezable-Typen unterstützen keinen Indexer. Indexer können daher in einem Animationspfad nur an einer Zwischenposition zwischen der Eigenschaft, mit der die Kette am benannten Ziel beginnt, und der ggf. animierten Eigenschaft verwendet werden. In der dargestellten Syntax ist dies propertyName2. Ein Indexer kann beispielsweise erforderlich sein, wenn die Zwischeneigenschaft eine Auflistung, z. B. TransformGroup, in einem Eigenschaftenpfad wie RenderTransform.Children[1].Angle ist.

PropertyPath im Code

Die Verwendung von Code für PropertyPath, einschließlich Angaben zur Erstellung eines PropertyPath, ist im Referenzthema für PropertyPath dokumentiert.

In der Regel verwendet PropertyPath zwei unterschiedliche Konstruktoren, einen für die Verwendung von Bindungen und einfachen Animationen und einen für die Verwendung komplexer Animationen. Verwenden Sie die PropertyPath(Object)-Signatur für Bindungsverwendungen, wenn das Objekt eine Zeichenfolge ist. Verwenden Sie die PropertyPath(Object)-Signatur für Animationspfade mit einem Schritt, wenn das Objekt eine DependencyProperty ist. Verwenden Sie die PropertyPath(String, array<Object[])-Signatur für komplexe Animationen. Der zuletzt genannte Konstruktor nutzt eine Tokenzeichenfolge für den ersten Parameter und ein Array mit Objekten, die die Positionen in der Tokenzeichenfolge füllen, um eine Eigenschaftenpfadbeziehung zu definieren.

Siehe auch

Konzepte

Übersicht über Datenbindung

Übersicht über Storyboards

Referenz

PropertyPath