Delen via


Syntaxis van PropertyPath XAML

Het PropertyPath-object ondersteunt een complexe inline XAML-syntaxis voor het instellen van verschillende eigenschappen die het PropertyPath type als waarde gebruiken. In dit onderwerp worden de PropertyPath syntaxen zoals ze worden toegepast op binding- en animatiesyntaxis gedocumenteerd.

Waar PropertyPath wordt gebruikt

PropertyPath is een algemeen object dat wordt gebruikt in verschillende WPF-functies (Windows Presentation Foundation). Ondanks het gebruik van de algemene PropertyPath om informatie over het eigenschappenpad over te brengen, variëren de gebruiksgegevens voor elk functiegebied waarin PropertyPath wordt gebruikt als een type. Daarom is het praktischer om de syntaxis per functie vast te leggen.

WPF maakt voornamelijk gebruik van PropertyPath om objectmodelpaden te beschrijven voor het doorlopen van de eigenschappen van een objectgegevensbron en om het doelpad voor doelanimaties te beschrijven.

Sommige stijl- en sjablooneigenschappen, zoals Setter.Property hebben een gekwalificeerde eigenschapsnaam die lijkt op een PropertyPath. Maar dit is geen echte PropertyPath, maar in plaats daarvan een gekwalificeerde owner.property tekenreeksindeling die mogelijk wordt gemaakt door de WPF XAML-processor in combinatie met de typeconverter voor DependencyProperty.

PropertyPath voor objecten in gegevensbinding

Gegevensbinding is een WPF-functie waarmee u verbinding kunt maken met de doelwaarde van elke afhankelijkheidseigenschap. De bron van een dergelijke gegevensbinding hoeft echter geen afhankelijkheidseigenschap te zijn; dit kan elk eigenschapstype zijn dat wordt herkend door de toepasselijke gegevensprovider. Eigenschappenpaden worden met name gebruikt voor de ObjectDataProvider, die wordt gebruikt voor het verkrijgen van bindingsbronnen van CLR-objecten (Common Language Runtime) en hun eigenschappen.

Houd er rekening mee dat gegevensbinding met XML geen PropertyPathgebruikt, omdat deze geen Path gebruikt in de Binding. In plaats daarvan gebruikt u XPath en geeft u geldige XPath-syntaxis op in het XML Document Object Model (DOM) van de gegevens. XPath wordt ook opgegeven als een tekenreeks, maar wordt hier niet gedocumenteerd; zie Binden aan XML-gegevens met behulp van een XMLDataProvider- en XPath-query's.

Een sleutel voor het begrijpen van eigenschapspaden in gegevensbinding is dat u de binding kunt richten op een afzonderlijke eigenschapswaarde of dat u in plaats daarvan kunt binden aan doeleigenschappen die lijsten of verzamelingen overnemen. Als u collecties bindt, bijvoorbeeld een ListBox die wordt uitgebreid afhankelijk van hoeveel data-elementen erin staan, dan moet uw eigenschapspad verwijzen naar het collectieobject, niet naar afzonderlijke collectie-items. De gegevenskoppelingsengine stemt automatisch de collectie die als gegevensbron wordt gebruikt af op het type van het koppelingsdoel, wat resulteert in gedrag zoals het vullen van een ListBox met een array van items.

Eén eigenschap op het onmiddellijke object als gegevenscontext

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

propertyName moet overeenkomen met de naam van een eigenschap die zich in de huidige DataContext bevindt voor een Path-gebruik. Als uw binding de bron bijwerkt, moet die eigenschap worden gelezen/geschreven en moet het bronobject onveranderbaar zijn.

Eén indexeerfunctie voor het onmiddellijke object als gegevenscontext

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

key moet de getypte index naar een woordenlijst of hashtabel of de gehele index van een matrix zijn. De waarde van de sleutel moet ook een type zijn dat rechtstreeks kan worden gebonden aan de eigenschap waarop deze wordt toegepast. Een hashtabel met tekenreekssleutels en tekenreekswaarden kan bijvoorbeeld op deze manier worden gebruikt om te binden aan tekst voor een TextBox. Als de sleutel naar een verzameling of subindex verwijst, kunt u deze syntaxis ook gebruiken om een doelverzamelingseigenschap te binden. Anders moet u verwijzen naar een specifieke eigenschap, via een syntaxis zoals <Binding Path="[key].propertyName" .../>.

U kunt zo nodig het type index opgeven. Zie Binding.Pathvoor meer informatie over dit aspect van een geïndexeerd eigenschapspad.

Meerdere eigenschappen (indirecte eigenschap doelgerichtheid)

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

propertyName moet de naam zijn van een eigenschap die de huidige DataContextis. De padeigenschappen propertyName en propertyName2 kunnen alle eigenschappen zijn die in een relatie bestaan, waarbij propertyName2 een eigenschap is die bestaat op het type dat de waarde van propertyNameis.

Enkel eigendom, gekoppeld of niet-gekoppeld Type-Qualified

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

De haakjes geven aan dat deze eigenschap in een PropertyPath moet worden samengesteld met behulp van een gedeeltelijke kwalificatie. Er kan een XML-naamruimte worden gebruikt om het type met een juiste toewijzing te vinden. De ownerType zoekt naar typen waartoe een XAML-processor toegang heeft, via de XmlnsDefinitionAttribute declaraties in elke assembly. De meeste toepassingen hebben de standaard XML-naamruimte toegewezen aan de http://schemas.microsoft.com/winfx/2006/xaml/presentation-naamruimte, dus een voorvoegsel is meestal alleen nodig voor aangepaste typen of typen die zich buiten die naamruimte bevinden. propertyName moet de naam zijn van een eigenschap die op de ownerTypebestaat. Deze syntaxis wordt doorgaans gebruikt voor een van de volgende gevallen:

  • Het pad wordt opgegeven in XAML in een stijl of sjabloon die geen opgegeven doeltype heeft. Een gekwalificeerd gebruik is over het algemeen niet geldig voor andere gevallen dan deze, omdat in niet-stijl, niet-sjabloon gevallen, de eigenschap bestaat op een exemplaar, niet een type.

  • De eigenschap is een gekoppelde eigenschap.

  • U bent gebonden aan een statische eigenschap.

Voor gebruik als storyboarddoel moet de eigenschap die is opgegeven als propertyName een DependencyPropertyzijn.

Bronnenverkenning (koppelen aan hiërarchieën van verzamelingen)

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

De / in deze syntaxis wordt gebruikt om te navigeren binnen een hiërarchisch gegevensbronobject en meerdere stappen in de hiërarchie met opeenvolgende /tekens worden ondersteund. De brontraversering houdt rekening met de huidige positie van de recordaanwijzer, die wordt bepaald door de gegevens te synchroniseren met de gebruikersinterface van de weergave. Zie voor meer informatie over binding met hiërarchische gegevensbronobjecten en het concept van de huidige recordaanwijzer in gegevensbinding Het patroon Master-Detail gebruiken met hiërarchische gegevens of Overzicht van gegevensbinding.

Opmerking

Oppervlakkig gezien lijkt deze syntaxis op XPath. Een echte XPath-expressie voor binding met een XML-gegevensbron wordt niet gebruikt als een Path waarde en moet in plaats daarvan worden gebruikt voor de wederzijds exclusieve eigenschap XPath.

Verzamelingsweergaven

Als u naar een benoemde verzamelingsweergave wilt verwijzen, moet u de naam van de verzamelingsweergave vooraf laten gaan door het hash-teken (#).

Huidige recordwijzer

Als u wilt verwijzen naar de huidige recordaanwijzer voor een gegevensbindingsscenario voor een verzamelingsweergave of hoofdgegevensbinding, start u de padtekenreeks met een slash (/). Elk bestandspad voorbij de schuine streep wordt doorlopen vanaf de huidige recordpointer.

Meerdere indexeerfuncties

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

of

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

Als een bepaald object meerdere indexeerfuncties ondersteunt, kunnen deze indexeerfuncties op volgorde worden opgegeven, vergelijkbaar met een syntaxis van een matrix waarnaar wordt verwezen. Het betreffende object kan de huidige context zijn of de waarde van een eigenschap die een object met meerdere indexen bevat.

Standaard worden de indexeerwaarden getypt met behulp van de kenmerken van het onderliggende object. U kunt zo nodig het type index opgeven. Zie Binding.Pathvoor meer informatie over het typen van de indexeerfuncties.

Het combineren van syntaxis

Elke van de syntaxis die hierboven staat, kan worden afgewisseld. Het volgende is bijvoorbeeld een voorbeeld waarmee een eigenschapspad wordt gemaakt naar de kleur op een bepaalde x,y van een ColorGrid eigenschap die een pixelrastermatrix van SolidColorBrush objecten bevat:

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

Escapes voor eigenschapspad tekenreeksen

Voor bepaalde zakelijke objecten kunt u een geval tegenkomen waarbij de tekenreeks voor het eigenschapspad een escapereeks vereist om correct te parseren. De noodzaak om te ontsnappen moet zeldzaam zijn, omdat veel van deze tekens vergelijkbare naamgevingsinteractieproblemen hebben in talen die doorgaans worden gebruikt om het bedrijfsobject te definiëren.

  • In indexeerfuncties ([ ]) wordt het volgende teken (^) ontsnapt.

  • U moet bepaalde tekens escapen (met XML-entiteiten) die speciaal zijn voor de definitie van de XML-taal. Gebruik & om het teken "&" te weglaten. Gebruik > om te ontsnappen aan de eindtag ">".

  • U moet tekens ontsnappen door een backslash (\) te gebruiken die speciaal zijn voor het WPF XAML-parsergedrag om een markup-extensie te verwerken.

    • Backslash (\) is het escape-teken zelf.

    • Het gelijkteken (=) scheidt de eigenschapsnaam van de eigenschapswaarde.

    • Met komma (,) worden eigenschappen gescheiden.

    • De rechter accolade (}) markeert het einde van een opmaakextensie.

Opmerking

Technisch gezien werken deze escapes ook voor een storyboard-eigenschapspad, maar u doorkruist meestal objectmodellen voor bestaande WPF-objecten en escapen moet onnodig zijn.

PropertyPath voor animatiedoelen

De doeleigenschap van een animatie moet een afhankelijkheidseigenschap zijn die een Freezable of een primitief type gebruikt. De doeleigenschap voor een type en de uiteindelijke eigenschap met animatie kunnen echter bestaan op verschillende objecten. Voor animaties wordt een eigenschapspad gebruikt om de verbinding tussen de eigenschap van het benoemde animatiedoelobject en de beoogde doelanimatie-eigenschap te definiëren door objecteigenschapsrelaties in de eigenschapswaarden te doorlopen.

Algemene Object-Property overwegingen voor animaties

Zie Storyboards Overview and Animation Overviewvoor meer informatie over animatieconcepten in het algemeen.

Het waardetype of de eigenschap die wordt geanimeerd, moet een Freezable type of een primitief datatype zijn. De eigenschap die het pad start, moet worden omgezet in de naam van een afhankelijkheidseigenschap die bestaat op het opgegeven TargetName type.

Om klonen te ondersteunen voor een Freezable die al is bevroren, moet het object dat wordt gespecificeerd door TargetName een klasse afgeleid van FrameworkElement of FrameworkContentElement zijn.

Eén eigenschap op het doelobject

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

propertyName moet worden omgezet in de naam van een afhankelijkheidseigenschap die bestaat op het opgegeven TargetName type.

Indirecte eigenschapsgerichtheid

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

propertyName moet een eigenschap zijn die een Freezable waardetype of een primitieve eigenschap is die bestaat op het opgegeven TargetName type.

propertyName2 moet de naam zijn van een afhankelijkheidseigenschap die bestaat op het object dat de waarde van propertyNameis. Met andere woorden, propertyName2 moet bestaan als een afhankelijkheidseigenschap voor het type dat de propertyNamePropertyTypeis.

Indirecte aansturing van animaties is noodzakelijk vanwege de toegepaste stijlen en sjablonen. Als u een animatie wilt toepassen, hebt u een TargetName voor een doelobject nodig en die naam wordt ingesteld door x:Name of Name. Hoewel sjabloon- en stijlelementen ook namen kunnen hebben, zijn deze namen alleen geldig binnen de naamscope van de stijl en sjabloon. (Als sjablonen en stijlen namenruimtes zouden delen met toepassingsmarkeringen, kunnen namen niet uniek zijn. De stijlen en sjablonen worden letterlijk gedeeld tussen instanties en zouden dubbele namen in stand houden.) Dus als de afzonderlijke eigenschappen van een element dat u mogelijk wilt animeren afkomstig zijn van een stijl of sjabloon, moet u beginnen met een benoemd exemplaar van een element dat niet uit een stijlsjabloon komt en vervolgens richten op de visuele structuur van de stijl of sjabloon om bij de eigenschap te komen die u wilt animeren.

De eigenschap Background van een Panel is bijvoorbeeld een volledige Brush (eigenlijk een SolidColorBrush) die afkomstig is van een themasjabloon. Als u een Brush volledig wilt animeren, moet er een BrushAnimation (waarschijnlijk één voor elk Brush type) zijn en er is geen dergelijk type. Als u een penseel wilt animeren, kunt u in plaats daarvan animatie toepassen op eigenschappen van een bepaald Brush type. U moet van SolidColorBrush naar de Color gaan om daar een ColorAnimation toe te passen. Het eigenschapspad voor dit voorbeeld zou Background.Colorzijn.

Gekoppelde eigenschappen

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

De haakjes geven aan dat deze eigenschap in een PropertyPath moet worden samengesteld met behulp van een gedeeltelijke kwalificatie. Er kan een XML-naamruimte worden gebruikt om het type te vinden. De ownerType zoekt naar typen waartoe een XAML-processor toegang heeft, via de XmlnsDefinitionAttribute declaraties in elke assembly. De meeste toepassingen hebben de standaard XML-naamruimte toegewezen aan de http://schemas.microsoft.com/winfx/2006/xaml/presentation-naamruimte, dus een voorvoegsel is meestal alleen nodig voor aangepaste typen of typen die zich buiten die naamruimte bevinden. propertyName moet de naam zijn van een eigenschap die op de ownerTypebestaat. De eigenschap die is opgegeven als propertyName moet een DependencyPropertyzijn. (Alle gekoppelde WPF-eigenschappen worden geïmplementeerd als afhankelijkheidseigenschappen, dus dit probleem is alleen van belang voor aangepaste gekoppelde eigenschappen.)

Indexeerders

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

De meeste afhankelijkheidseigenschappen of Freezable typen bieden geen ondersteuning voor een indexeerfunctie. Daarom bevindt het enige gebruik voor een indexeerfunctie in een animatiepad zich op een tussenliggende positie tussen de eigenschap die de keten op het benoemde doel start en de uiteindelijke eigenschap animatie. In de opgegeven syntaxis is dat propertyName2. Een indexeerfunctiegebruik kan bijvoorbeeld nodig zijn als de tussenliggende eigenschap een verzameling is, zoals TransformGroup, in een eigenschapspad zoals RenderTransform.Children[1].Angle.

Eigenschapspad in Code

Codegebruik voor PropertyPath, inclusief het maken van een PropertyPath, wordt beschreven in het referentieonderwerp voor PropertyPath.

Over het algemeen is PropertyPath ontworpen voor het gebruik van twee verschillende constructors, één voor het bindingsgebruik en het eenvoudigste animatiegebruik, en één voor het complexe animatiegebruik. Gebruik de PropertyPath(Object) handtekening voor bindingsgebruik, waarbij het object een tekenreeks is. Gebruik de PropertyPath(Object) handtekening voor animatiepaden in één stap, waarbij het object een DependencyPropertyis. Gebruik de PropertyPath(String, Object[]) handtekening voor complexe animaties. Deze laatste constructor maakt gebruik van een tokentekenreeks voor de eerste parameter en een matrix met objecten die posities in de tokentekenreeks doorvoeren om een eigenschapspadrelatie te definiëren.

Zie ook