Dela via


PropertyPath XAML-syntax

Objektet PropertyPath stöder en komplex infogad XAML-syntax för att ange olika egenskaper som använder PropertyPath typ som värde. Det här avsnittet dokumenterar PropertyPath syntax som tillämpas på bindnings- och animeringssyntaxer.

Där PropertyPath används

PropertyPath är ett vanligt objekt som används i flera WPF-funktioner (Windows Presentation Foundation). Trots att den vanliga PropertyPath används för att förmedla information om egenskapssökvägar, varierar användningen i varje funktionsområde där PropertyPath används som en typ. Därför är det mer praktiskt att dokumentera syntaxerna per funktion.

I första hand använder WPF PropertyPath för att beskriva objektmodellsökvägar för att bläddra igenom egenskaperna för en objektdatakälla och för att beskriva målsökvägen för riktade animeringar.

Vissa format- och mallegenskaper, till exempel Setter.Property, tar ett kvalificerat egenskapsnamn som till synes liknar en PropertyPath. Men detta är inte en sann PropertyPath; i stället är det en kvalificerad owner.property strängformatanvändning som aktiveras av WPF XAML-processorn i kombination med typkonverteraren för DependencyProperty.

PropertyPath för objekt i databindning

Databindning är en WPF-funktion där du kan binda till målvärdet för alla beroendeegenskaper. Källan till en sådan databindning behöver dock inte vara en beroendeegenskap. det kan vara vilken egenskapstyp som helst som identifieras av den tillämpliga dataleverantören. Egenskapssökvägar används särskilt för ObjectDataProvider, som används för att hämta bindningskällor från CLR-objekt (Common Language Runtime) och deras egenskaper.

Observera att databindningen till XML inte använder PropertyPatheftersom den inte använder Path i Binding. I stället använder du XPath och anger giltig XPath-syntax i XML-dokumentobjektmodellen (DOM) för data. XPath anges också som en sträng, men dokumenteras inte här. se Binda till XML-data med hjälp av en XMLDataProvider- och XPath-frågor.

En nyckel till att förstå egenskapssökvägar i databindning är att du kan rikta bindningen till ett enskilt egenskapsvärde, eller så kan du binda till egenskaper som hanterar listor eller samlingar. Om du binder samlingar, som till exempel en ListBox som expanderas beroende på hur många dataartiklar som finns i samlingen, bör din egenskapssökväg referera till samlingen, inte enskilda objekt. Databindningsmotorn matchar den samling som används som datakälla till typen av bindningsmål automatiskt, vilket resulterar i beteende som att fylla i en ListBox med en objektmatris.

Enskild egenskap i det omedelbara objektet som datakontext

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

propertyName måste överensstämma med ett egenskapsnamn som finns i den aktuella DataContext för användning av en Path. Om din bindning uppdaterar källan måste den egenskapen läsas/skrivas och källobjektet måste vara föränderligt.

Enskild indexerare för det omedelbara objektet som datakontext

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

key måste vara antingen det inskrivna indexet i en ordlista eller en hash-tabell eller heltalsindexet för en matris. Dessutom måste värdet för nyckeln vara en typ som är direkt bindbar till egenskapen där den tillämpas. Till exempel kan en hash-tabell som innehåller strängnycklar och strängvärden användas på det här sättet för att binda till Text för en TextBox. Om nyckeln pekar på en samling eller ett underindex kan du använda den här syntaxen för att binda till en målsamlingsegenskap. Annars måste du referera till en specifik egenskap via en syntax som <Binding Path="[key].propertyName" .../>.

Du kan ange typ av index om det behövs. Mer information om den här aspekten av en indexerad egenskapssökväg finns i Binding.Path.

Flera egenskaper (indirekt egenskapsinriktning)

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

propertyName måste vara namnet på en egenskap som är den nuvarande DataContext. Sökvägsegenskaperna propertyName och propertyName2 kan vara alla egenskaper som finns i en relation, där propertyName2 är en egenskap som finns på den typ som är värdet för propertyName.

Enskild fastighet, bifogad eller på annat sätt Type-Qualified

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

Parenteserna anger att den här egenskapen i en PropertyPath ska konstrueras med hjälp av en partiell kvalificering. Den kan använda ett XML-namnområde för att hitta typen med en lämplig mappning. ownerType söker efter typer som en XAML-processor har åtkomst till, via XmlnsDefinitionAttribute-deklarationerna i varje sammansättning. De flesta program har xml-standardnamnområdet mappat till http://schemas.microsoft.com/winfx/2006/xaml/presentation namnområde, så ett prefix är vanligtvis bara nödvändigt för anpassade typer eller typer som annars ligger utanför namnområdet. propertyName måste avse att vara namnet på en egenskap som existerar på ownerType. Den här syntaxen används vanligtvis för något av följande fall:

  • Sökvägen anges i XAML som är i ett format eller en mall som inte har någon angiven måltyp. En kvalificerad användning är i allmänhet inte giltig för andra fall än detta, eftersom egenskapen existerar på en instans och inte på en typ i fall som inte är stil- eller mallrelaterade.

  • Egenskapen är en bifogad egenskap.

  • Du binder till en statisk egenskap.

För användning som storyboard-mål måste egenskapen som anges med propertyName vara en DependencyProperty.

Källövergång (koppling till hierarkier av samlingar)

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

Syntaxen /i den här syntaxen används för att navigera i ett hierarkiskt datakällobjekt, och flera steg i hierarkin med efterföljande/tecken stöds. Den källbläddringen tar hänsyn till den aktuella positionen av postpekaren, vilken bestäms genom att synkronisera data med vyns gränssnitt. Mer information om bindning med objekt från hierarkiska datakällor och konceptet med den aktuella postpekaren i databindning finns i Använd Master-Detail-mönstret med hierarkiska data eller Översikt över databindning.

Anteckning

Ytligt sett liknar den här syntaxen XPath. Ett sant XPath-uttryck för bindning till en XML-datakälla används inte som ett Path värde och bör i stället användas för den ömsesidigt uteslutande XPath egenskapen.

Samlingsvyer

Om du vill referera till en namngiven samlingsvy prefixar du samlingsvynamnet med hash-tecknet (#).

Aktuell rekordpekare

Om du vill referera till den aktuella postpekaren för en samlingsvy eller ett databindningsscenario för huvudinformation startar du sökvägssträngen med ett snedstreck (/). Alla sökvägar förbi snedstrecket bläddras från den aktuella postpekaren.

Flera indexerare

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

eller

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

Om ett visst objekt stöder flera indexerare kan dessa indexerare anges i ordning, ungefär som en matris som refererar till syntax. Objektet i fråga kan vara antingen den aktuella kontexten eller värdet för en egenskap som innehåller ett objekt med flera index.

Indexerarvärdena skrivs som standard med hjälp av egenskaperna för det underliggande objektet. Du kan ange typ av index om det behövs. Mer information om hur du skriver indexerarna finns i Binding.Path.

Blandningssyntaxer

Varje syntax som visas ovan kan varvas. Följande är till exempel ett exempel som skapar en egenskapssökväg till färgen vid ett visst x,y för en ColorGrid egenskap som innehåller en pixelrutnätmatris med SolidColorBrush objekt:

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

Escapes för egenskapssökvägssträngar

För vissa affärsobjekt kan du stöta på ett fall där egenskapssökvägssträngen kräver en escape-sekvens för att tolkas korrekt. Behovet av att fly bör vara sällsynt, eftersom många av dessa tecken har liknande problem med namngivning och interaktion på språk som vanligtvis används för att definiera affärsobjektet.

  • Inuti indexerare ([ ]) används hacktecknet (^) för att avsluta nästa tecken.

  • Du måste ersätta (med XML-entiteter) vissa tecken som är speciella i XML-språkdefinitionen. Använd & för att undvika tecknet "&". Använd > för att undkomma sluttaggen ">".

  • Du måste fly (med omvänt snedstreck \) tecken som är speciella för WPF XAML-parsningsbeteendet för bearbetning av ett markeringstillägg.

    • Omvänt snedstreck (\) är själva escape-tecknet.

    • Likhetstecknet (=) separerar egenskapsnamnet från egenskapsvärdet.

    • Kommatecken (,) separerar egenskaper.

    • Rätt klammerparentes (}) är slutet på ett tillägg för markering.

Not

Tekniskt sett fungerar dessa escape-tecken också för en storyboard-egenskapssökväg, men du traverserar vanligtvis objektmodeller för befintliga WPF-objekt, och att använda escape-tecken borde inte vara nödvändigt.

PropertyPath för animeringsmål

Målegenskapen för en animering måste vara en beroendeegenskap som antingen tar en Freezable eller en primitiv typ. Den målinriktade egenskapen på en typ och den slutliga animerade egenskapen kan dock finnas på olika objekt. För animeringar används en egenskapssökväg för att fastställa sambandet mellan egenskapen hos det namngivna målobjektet för animering och den avsedda egenskapen för målanimeringen, genom att navigera genom relationerna mellan objekt och egenskaper i egenskapsvärdena.

Allmänna Object-Property överväganden för animeringar

Mer information om animeringsbegrepp i allmänhet finns i Översikt över storyboards och Översikt över animeringar.

Värdetypen eller egenskapen som animeras måste vara antingen en Freezable-typ eller en primitiv. Egenskapen som startar sökvägen måste vara namnet på en beroendeegenskap som finns på den angivna typen TargetName.

För att stödja kloning för att animera en Freezable som redan är fryst måste objektet som anges av TargetName vara en klass som härstammar från FrameworkElement eller FrameworkContentElement.

Enskild egenskap för målobjektet

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

propertyName måste matcha för att vara namnet på en beroendeegenskap som finns på den angivna TargetName typen.

Indirekt inriktning på egenskaper

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

propertyName måste vara en egenskap som antingen är en Freezable värdetyp eller en primitiv, som finns på den angivna TargetName typen.

propertyName2 måste vara namnet på en beroendeegenskap som finns på objektet som är värdet för propertyName. Med andra ord måste propertyName2 finnas som en beroendeegenskap för den typ som är propertyNamePropertyType.

Indirekt inriktning av animeringar är nödvändig på grund av tillämpade format och mallar. För att kunna rikta en animering behöver du en TargetName på ett målobjekt och det namnet upprättas av x:Name eller Name. Även om mall- och formatelement också kan ha namn är dessa namn endast giltiga inom formatmallens och mallens namnskop. (Om mallar och formatmallar delade namnskop med programmarkering kan namn inte vara unika. Formatmallarna och mallarna delas bokstavligen mellan instanser och skulle vidmakthålla duplicerade namn.) Om de enskilda egenskaperna för ett element som du kanske vill animera kommer från ett format eller en mall måste du börja med en namngiven elementinstans som inte kommer från en formatmall och sedan rikta in dig på det visuella formatmallsträdet eller mallträdet för att komma fram till den egenskap som du vill animera.

Egenskapen Background för en Panel är till exempel en fullständig Brush (i själva verket en SolidColorBrush) som kom från en temamall. För att animera en Brush helt skulle det behövas en BrushAnimation (förmodligen en för varje Brush typ) och det finns ingen sådan typ. Om du vill animera en pensel animerar du i stället egenskaper av en viss Brush typ. Du måste komma från SolidColorBrush till dess Color för att där tillämpa en ColorAnimation. Egenskapssökvägen för det här exemplet skulle vara Background.Color.

Anslutna egenskaper

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

Parenteserna anger att den här egenskapen i en PropertyPath ska konstrueras med hjälp av en partiell kvalificering. Den kan använda ett XML-namnområde för att hitta typen. ownerType söker efter typer som en XAML-processor har åtkomst till, via XmlnsDefinitionAttribute-deklarationerna i varje sammansättning. De flesta program har xml-standardnamnområdet mappat till http://schemas.microsoft.com/winfx/2006/xaml/presentation namnområde, så ett prefix är vanligtvis bara nödvändigt för anpassade typer eller typer som annars ligger utanför namnområdet. propertyName måste lösas till att vara namnet på en egenskap som existerar på ownerType. Egenskapen som anges som propertyName måste vara en DependencyProperty. (Alla WPF-kopplade egenskaper implementeras som beroendeegenskaper, så det här problemet gäller endast anpassade anslutna egenskaper.)

Indexerare

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

De flesta beroendeegenskaper eller Freezable typer stöder inte en indexerare. Därför är den enda användningen för en indexerare i en animeringssökväg en mellanliggande position mellan egenskapen som startar kedjan på det namngivna målet och den slutliga animerade egenskapen. I den angivna syntaxen är det propertyName2. En indexerare kan till exempel vara nödvändig om den mellanliggande egenskapen är en samling, till exempel TransformGroup, i en egenskapssökväg som RenderTransform.Children[1].Angle.

PropertyPath i kod

Kodanvändning för PropertyPath, inklusive hur du skapar en PropertyPath, dokumenteras i referensavsnittet för PropertyPath.

I allmänhet är PropertyPath utformat för att använda två olika konstruktorer, en för bindningsanvändningar och enklaste animeringsanvändningar och en för komplexa animeringsanvändningar. Använd den PropertyPath(Object) signaturen för bindningsanvändning, där objektet är en sträng. Använd PropertyPath(Object)-signaturen för enstegsanimeringssökvägar, där objektet är en DependencyProperty. Använd signaturen PropertyPath(String, Object[]) för komplexa animeringar. Den senare konstruktorn använder en tokensträng för den första parametern och en matris med objekt som fyller positioner i tokensträngen för att definiera en egenskapssökvägsrelation.

Se även