Dela via


Syntax för egenskapssökväg

Du kan använda klassen PropertyPath och strängsyntaxen för att instansiera ett PropertyPath-värde i XAML eller i kod. PropertyPath-värden används av databindning. En liknande syntax används för att rikta in sig på storyboardade animeringar. I båda scenarierna beskriver en egenskapssökväg en bläddering av en eller flera objektegenskapsrelationer som slutligen matchas till en enda egenskap.

Du kan ange en egenskapssökvägssträng direkt till ett attribut i XAML. Du kan använda samma strängsyntax för att konstruera en PropertyPath som anger en bindning i kod, eller för att ange ett animeringsmål i kod med setTargetProperty. Det finns två olika funktionsområden i Windows Runtime som använder en egenskapssökväg: databindning och animeringsmål. Animeringsmål skapar inte underliggande egenskapssökvägssyntaxvärden i Windows Runtime-implementeringen; informationen behålls som en sträng, men begreppen för objekt- och egenskapstraverseringar är mycket lika. Databindning och animering som riktar sig till var och en utvärderar en egenskapssökväg något annorlunda, så vi beskriver syntaxen för egenskapssökväg separat för var och en.

Egenskapssökväg för objekt i databindning

I Windows Runtime kan du binda till målvärdet för valfri beroendeegenskap. Källegenskapsvärdet för en databindning behöver inte vara en beroendeegenskap. det kan vara en egenskap för ett affärsobjekt (till exempel en klass som skrivits på ett Microsoft .NET-språk eller C++). Eller så kan källobjektet för bindningsvärdet vara ett befintligt beroendeobjekt som redan har definierats av appen. Källan kan refereras antingen med ett enkelt egenskapsnamn eller genom en bläddering av objektegenskapsrelationerna i objektdiagrammet för affärsobjektet.

Du kan binda till ett enskilt egenskapsvärde eller till en mål-egenskap som innehåller listor eller samlingar. Om källan är en samling, eller om sökvägen anger en samlingsegenskap, matchar databindningsmotorn samlingsobjekten i källan till bindningsmålet, vilket resulterar i beteende som att fylla i en ListBox med en lista över objekt från en datakällsamling utan att behöva förutse de specifika objekten i samlingen.

Bläddra i ett objektdiagram

Elementet i syntaxen som anger traversering av en objektegenskapsrelation i ett objektdiagram är punkttecknet (.). Varje punkt i en egenskapssökvägssträng anger en uppdelning mellan ett objekt (vänster sida av punkten) och en egenskap för objektet (höger sida av punkten). Strängen utvärderas från vänster till höger, vilket gör det möjligt att stega igenom flera objektegenskapsrelationer. Nu ska vi titta på ett exempel:

"{Binding Path=Customer.Address.StreetAddress1}"

Så här utvärderas den här sökvägen:

  1. Datakontextobjektet (eller en källa som anges av samma bindning) söks efter en egenskap med namnet "Kund".
  2. Objektet som är värdet för egenskapen "Kund" söks efter en egenskap med namnet "Adress".
  3. Objektet som är värdet för egenskapen "Adress" söks efter en egenskap med namnet "StreetAddress1".

Vid vart och ett av dessa steg behandlas värdet som ett objekt. Typen av resultat kontrolleras endast när bindningen tillämpas på en specifik egenskap. Det här exemplet skulle misslyckas om "Adress" bara var ett strängvärde som inte exponerade vilken del av strängen som var gatuadressen. Bindningen pekar vanligtvis på de specifika kapslade egenskapsvärdena för ett affärsobjekt som har en känd och avsiktlig informationsstruktur.

Regler för egenskaperna i en sökväg för databindningsegenskaper

  • Alla egenskaper som refereras till av en egenskapssökväg måste vara offentliga i källobjektet.
  • Slutegenskapen (egenskapen som är den senast namngivna egenskapen i sökvägen) måste vara offentlig och måste vara föränderlig – du kan inte binda till statiska värden.
  • Slutegenskapen måste läsas/skrivas om den här sökvägen används som sökvägsinformation för en dubbelriktad bindning.

Indexerare

En egenskapssökväg för databindning kan innehålla referenser till indexerade egenskaper. Detta möjliggör bindning till ordnade listor/vektorer eller till ordlistor/kartor. Använd hakparenteser "[]" för att ange en indexerad egenskap. Innehållet i dessa hakparenteser kan vara antingen ett heltal (för ordnad lista) eller en icke-citatsträng (för ordlistor). Du kan också binda till en ordlista där nyckeln är ett heltal. Du kan använda olika indexerade egenskaper i samma sökväg med en punkt som avgränsar objektegenskapen.

Tänk dig till exempel ett affärsobjekt där det finns en lista över "Teams" (ordnad lista), som var och en har en ordlista med "Spelare" där varje spelare är försedd med efternamn. Ett exempel på egenskapssökväg till en specifik spelare i det andra laget är: "Teams[1]. Spelare[Smith]". (Du använder 1 för att ange det andra objektet i "Teams" eftersom listan är nollindexerad.)

Anmärkning

Indexeringsstöd för C++-datakällor är begränsat. se Databindning på djupet.

Anslutna egenskaper

Egenskapssökvägar kan innehålla referenser till kopplade egenskaper. Eftersom identifieringsnamnet för en bifogad egenskap redan innehåller en punkt, måste du omsluta alla kopplade egenskapsnamn inom parenteser så att punkten inte behandlas som ett objektegenskapssteg. Strängen som anger att du vill använda Canvas.ZIndex som bindningssökväg är till exempel "(Canvas.ZIndex)". Mer information om bifogade egenskaper finns i Översikt över bifogade egenskaper.

Kombinering av egenskapssökvägssyntax

Du kan kombinera olika element i egenskapssökvägssyntaxen i en enda sträng. Du kan till exempel definiera en egenskapssökväg som refererar till en indexerad bifogad egenskap, om datakällan hade en sådan egenskap.

Felsöka en bindningsegenskapssökväg

Eftersom en egenskapssökväg tolkas av en bindningsmotor och förlitar sig på information som kanske bara finns vid körning, måste du ofta felsöka en egenskapssökväg för bindning utan att kunna förlita dig på konventionellt stöd för designtid eller kompileringstid i utvecklingsverktygen. I många fall är körningsresultatet av att det inte går att lösa en egenskapssökväg ett tomt värde utan fel, eftersom det är det avsiktliga återställningsbeteendet för bindningsmatchning. Lyckligtvis tillhandahåller Microsoft Visual Studio ett felsökningsutdataläge som kan isolera vilken del av en egenskapssökväg som anger en bindningskälla som inte kunde matchas. Mer information om hur du använder den här funktionen för utvecklingsverktyg finns i avsnittet "Felsökning" i Databindning på djupet.

Egenskapssökväg för animeringsmål

Animeringar förlitar sig på att rikta in sig på en beroendeegenskap där storyboardade värden tillämpas när animeringen körs. För att identifiera objektet där egenskapen som ska animerad finns riktar sig animeringen mot ett element efter namn (x:Namnattribut). Det är ofta nödvändigt att definiera en egenskapssökväg som börjar med objektet som identifieras som Storyboard.TargetName och slutar med det specifika beroendeegenskapsvärdet där animeringen ska tillämpas. Den här egenskapssökvägen används som värde för Storyboard.TargetProperty.

Mer information om hur du definierar animeringar i XAML finns i Storyboarded-animeringar.

Enkel inriktning

Om du animerar en egenskap som finns på själva målobjektet och egenskapens typ kan ha en animering som tillämpas direkt på den (i stället för en underegenskap för en egenskaps värde) kan du bara namnge egenskapen som animerad utan ytterligare kvalificering. Om du till exempel riktar in dig på en formunderklass , till exempel rektangel, och du använder en animerad färg på egenskapen Fyllning , kan din egenskapssökväg vara "Fyllning".

Indirekt egenskapsinriktning

Du kan animera en egenskap som är en underegenskap för målobjektet. Med andra ord, om det finns en egenskap för målobjektet som är ett objekt i sig, och objektet har egenskaper, måste du definiera en egenskapssökväg som förklarar hur du går igenom den objektegenskapsrelationen. När du anger ett objekt där du vill animera en underegenskap omger du egenskapsnamnet inom parenteser och anger egenskapen i typename. propertyname-format . Om du till exempel vill ange objektvärdet för ett målobjekts RenderTransform-egenskap anger du "(UIElement.RenderTransform)" som det första steget i egenskapssökvägen. Det här är ännu inte en fullständig sökväg eftersom det inte finns några animeringar som kan tillämpas direkt på ett Transform-värde. I det här exemplet slutför du nu egenskapssökvägen så att slutegenskapen är en egenskap för en transformeringsunderklass som kan animeras med ett Double-värde : "(UIElement.RenderTransform). (CompositeTransform.TranslateX)"

Specificera ett särskilt element i en samling

Om du vill ange ett underordnat objekt i en samlingsegenskap kan du använda en numerisk indexerare. Använd hakparenteser "[]" tecken runt heltalsindexvärdet. Du kan bara referera till ordnade listor, inte ordlistor. Eftersom en samling inte är ett värde som kan animeeras kan en indexerare aldrig vara slutegenskapen i en egenskapssökväg.

Om du till exempel vill animera den första färgstoppsfärgen i en LinearGradientBrush som tillämpas på bakgrundsegenskapen för en kontroll är det här egenskapssökvägen: "(Control.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)". Observera att indexeraren inte är det sista steget i sökvägen och att det sista steget särskilt måste referera till egenskapen GradientStop.Color för objekt 0 i samlingen för att tillämpa ett animerat färgvärde på den.

Animera en bifogad egenskap

Det är inte ett vanligt scenario, men det är möjligt att animera en bifogad egenskap, så länge den bifogade egenskapen har ett egenskapsvärde som matchar en animeringstyp. Eftersom identifieringsnamnet för en bifogad egenskap redan innehåller en punkt, måste du omsluta alla kopplade egenskapsnamn inom parenteser så att punkten inte behandlas som ett objektegenskapssteg. För att till exempel animera den kopplade egenskapen Grid.Row på ett objekt, använd egenskapssökvägen "(Grid.Row)".

Anmärkning

I det här exemplet är värdet för Grid.Row en int32-egenskapstyp . Således kan du inte animera den med en Dubbel animation. I stället skulle du definiera ett ObjectAnimationUsingKeyFrames som har DiscreteObjectKeyFrame-komponenter , där ObjectKeyFrame.Value är inställt på ett heltal som "0" eller "1".

Regler för egenskaperna i en egenskapssökväg för animering

  • Den antagna startpunkten för egenskapssökvägen är objektet som identifieras av en Storyboard.TargetName.
  • Alla objekt och egenskaper som refereras längs egenskapssökvägen måste vara publika.
  • Slutegenskapen (egenskapen som är den senast namngivna egenskapen i sökvägen) måste vara offentlig, vara läs- och skrivbar och vara en beroendeegenskap.
  • Slutegenskapen måste ha en egenskapstyp som kan animerads av en av de breda klasser av animeringstyper (färganimeringar , dubbla animeringar, punktanimationer , ObjectAnimationUsingKeyFrames).

Klassen PropertyPath

Klassen PropertyPath är den underliggande egenskapstypen Binding.Path för bindningsscenariot.

För det mesta kan du använda en PropertyPath i XAML utan att använda någon kod alls. Men i vissa fall kanske du vill definiera ett PropertyPath-objekt med hjälp av kod och tilldela det till en egenskap när programmet körs.

PropertyPath har en PropertyPath-konstruktor (sträng) och har ingen standardkonstruktor. Strängen som du skickar till den här konstruktorn är en sträng som definieras med hjälp av syntaxen för egenskapssökväg som vi förklarade tidigare. Det här är också samma sträng som du använder för att tilldela Path som ett XAML-attribut. Det enda andra API:et för klassen PropertyPath är egenskapen Path , som är skrivskyddad. Du kan använda den här egenskapen som byggsträng för en annan PropertyPath-instans .