Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
U kunt de EigenschapPath-klasse en de tekenreekssyntaxis gebruiken om een PropertyPath-waarde te instantiëren in XAML of in code. PropertyPath-waarden worden gebruikt door gegevensbinding. Een vergelijkbare syntaxis wordt gebruikt voor het aansturen van storyboard-animaties. In beide scenario's beschrijft een eigenschapspad een doorkruising van een of meer objecteigenschapsrelaties die uiteindelijk worden omgezet in één eigenschap.
U kunt een eigenschapspad-tekenreeks rechtstreeks instellen op een kenmerk in XAML. U kunt dezelfde tekenreekssyntaxis gebruiken om een PropertyPath te maken waarmee een binding in code wordt ingesteld of om een animatiedoel in code in te stellen met behulp van SetTargetProperty. Er zijn twee verschillende functiegebieden in De Windows Runtime die gebruikmaken van een eigenschapspad: gegevensbinding en animatiedoel. Animatiedoelen creëren geen onderliggende syntaxiswaarden voor eigenschapspaden in de Windows Runtime-implementatie; de informatie blijft echter als een tekenreeks behouden, maar de concepten van het doorlopen van object- en eigenschapspaden zijn zeer vergelijkbaar. Gegevensbinding en animatie beoordelen elk op een iets andere manier een eigenschapspad, daarom beschrijven we de syntaxis van het eigenschapspad afzonderlijk voor elk.
Eigenschapspad voor objecten in gegevensbinding
In Windows Runtime kunt u verbinding maken met de doelwaarde van een afhankelijkheidseigenschap. De waarde van de broneigenschap voor een gegevensbinding hoeft geen afhankelijkheidseigenschap te zijn; dit kan een eigenschap zijn voor een zakelijk object (bijvoorbeeld een klasse die is geschreven in een Microsoft .NET-taal of C++). Of het bronobject voor de bindingswaarde kan een bestaand afhankelijkheidsobject zijn dat al door de app is gedefinieerd. Er kan naar de bron worden verwezen door een eenvoudige attribuutnaam te gebruiken, of door het doorlopen van de object-eigenschapsrelaties in de objectgrafiek van het zakelijke object.
U kunt een binding maken met een afzonderlijke eigenschapswaarde of een doeleigenschap die lijsten of verzamelingen bevat instellen. Als uw bron een verzameling is of als het pad een verzamelingseigenschap opgeeft, stemt de gegevensbindingsengine de verzamelingsitems van de bron af op het bindingsdoel, wat resulteert in gedrag zoals het invullen van een ListBox met de items uit een gegevensbronverzameling zonder dat u van tevoren op de hoogte hoeft te zijn van de specifieke items in die verzameling.
Een objectgrafiek doorlopen
Het element van de syntaxis die de doorkruising van een objecteigenschapsrelatie in een objectgrafiek aangeeft, is het puntteken (.). Elke punt in een tekenreeks voor een eigenschapspad geeft een verdeling aan tussen een object (links van de stip) en een eigenschap van dat object (rechterkant van de stip). De tekenreeks wordt van links naar rechts geëvalueerd, waardoor u meerdere objecteigenschapsrelaties kunt doorlopen. Laten we eens kijken naar een voorbeeld:
"{Binding Path=Customer.Address.StreetAddress1}"
Dit pad wordt als volgt geëvalueerd:
- Het gegevenscontextobject (of een bron die is opgegeven door dezelfde binding) wordt gezocht naar een eigenschap met de naam Klant.
- Het object dat de waarde van de eigenschap Klant is, wordt gezocht naar een eigenschap met de naam 'Adres'.
- Het object dat de waarde is van de eigenschap "Adres" wordt doorzocht naar een eigenschap met de naam "StreetAddress1".
Bij elk van deze stappen wordt de waarde behandeld als een object. Het type van het resultaat wordt alleen gecontroleerd wanneer de binding wordt toegepast op een specifieke eigenschap. Dit voorbeeld mislukt als 'Adres' alleen een tekenreekswaarde was die niet heeft weergegeven welk deel van de tekenreeks het adres was. Normaal gesproken verwijst de binding naar de specifieke geneste eigenschapswaarden van een bedrijfsobject met een bekende en opzettelijke informatiestructuur.
Regels voor de eigenschappen in een eigenschapspad voor gegevensbinding
- Alle eigenschappen waarnaar wordt verwezen door een eigenschapspad, moeten openbaar zijn in het bronbedrijfsobject.
- De eindeigenschap (de eigenschap die de laatste benoemde eigenschap in het pad is) moet openbaar zijn en moet veranderlijk zijn. U kunt geen binding maken met statische waarden.
- De eigenschap end moet lees- en schrijfbaar zijn als dit pad wordt gebruikt als padinformatie voor een tweerichtingsbinding.
Indexeerders
Een eigenschapspad voor gegevensbinding kan verwijzingen naar geïndexeerde eigenschappen bevatten. Hierdoor kunnen geordende lijsten/vectoren of woordenlijsten/kaarten worden gekoppeld. Gebruik vierkante haken []-tekens om een geïndexeerde eigenschap aan te geven. De inhoud van deze haakjes kan een geheel getal (voor geordende lijst) of een niet-aanhalingstekenreeks (voor woordenlijsten) zijn. U kunt ook verbinding maken met een woordenlijst waarbij de sleutel een geheel getal is. U kunt verschillende geïndexeerde eigenschappen in hetzelfde pad gebruiken met een punt tussen de objecteigenschap.
Denk bijvoorbeeld aan een zakelijk object waarin een lijst met 'Teams' (geordende lijst) staat, die elk een woordenlijst van "Spelers" heeft, waarbij elke speler op achternaam wordt opgegeven. Een voorbeeld van een eigenschapspad naar een specifieke speler in het tweede team is: "Teams[1]. Spelers[Smith]". (U gebruikt 1 om het tweede item in Teams aan te geven omdat de lijst nul geïndexeerd is.)
Opmerking
Indexeringsondersteuning voor C++-gegevensbronnen is beperkt; zie gedetailleerde gegevensbinding.
Gekoppelde eigenschappen
Eigenschapspaden kunnen verwijzingen naar gekoppelde eigenschappen bevatten. Omdat de identificatienaam van een gekoppelde eigenschap al een punt bevat, moet u de naam van een gekoppelde eigenschap tussen haakjes insluiten, zodat de punt niet wordt behandeld als een objecteigenschapsstap. De tekenreeks om aan te geven dat u Canvas.ZIndex als bindingspad wilt gebruiken, is bijvoorbeeld "(Canvas.ZIndex)". Zie Het overzicht van bijgevoegde eigenschappen voor meer informatie over gekoppelde eigenschappen.
Syntaxis van eigenschapspad combineren
U kunt verschillende elementen van de syntaxis van het eigenschapspad combineren in één tekenreeks. U kunt bijvoorbeeld een eigenschapspad definiëren dat verwijst naar een geïndexeerde gekoppelde eigenschap als uw gegevensbron een dergelijke eigenschap had.
Foutopsporing van een bindingseigenschapspad
Omdat een eigenschapspad wordt geïnterpreteerd door een bindingsengine en afhankelijk is van informatie die mogelijk alleen tijdens de runtime aanwezig is, moet u vaak fouten opsporen in een eigenschapspad voor binding zonder dat u kunt vertrouwen op conventionele ontwerp- of compileertijdondersteuning in de ontwikkelhulpprogramma's. In veel gevallen is het resultaat van het niet kunnen oplossen van een eigenschapspad een lege waarde zonder foutmelding, omdat dat het opzettelijk ontworpen terugvalgedrag van bindingsresolutie is. Gelukkig biedt Microsoft Visual Studio een foutopsporingsuitvoermodus waarmee kan worden geïsoleerd welk deel van een eigenschapspad, dat de bindingsbron specificeert, niet kon worden opgelost. Zie de sectie over Foutopsporing en Uitgebreide Gegevensbinding voor meer informatie over het gebruik van deze functie voor ontwikkelhulpprogramma's.
Eigenschapspad voor het instellen van animatiedoelwit
Animaties zijn afhankelijk van het richten op een afhankelijkheidseigenschap waar storyboard waarden worden toegepast wanneer de animatie wordt uitgevoerd. Om het object te identificeren waar de te animeren eigenschap zich bevindt, richt de animatie zich op een element met de naam (x:Name attribute). Het is vaak nodig om een eigenschapspad te definiëren dat begint met het object dat is geïdentificeerd als storyboard.TargetName, en eindigt met de specifieke waarde van de afhankelijkheidseigenschap waar de animatie moet worden toegepast. Dat eigenschapspad wordt gebruikt als de waarde voor Storyboard.TargetProperty.
Zie Storyboarded animaties voor meer informatie over het definiëren van animaties in XAML.
Eenvoudig targeten
Als u een eigenschap animeert die op het doelobject zelf bestaat en het type van die eigenschap rechtstreeks geanimeerd kan worden (in plaats van op een sub-eigenschap van de waarde van een eigenschap), kunt u simpelweg de naam van de te animeren eigenschap geven zonder verdere specificatie. Als u zich bijvoorbeeld richt op een subklasse Shape , zoals Rechthoek, en u een geanimeerde kleur toepast op de eigenschap Opvulling , kan het eigenschapspad 'Opvulling' zijn.
Indirecte eigenschapstargeting
U kunt animatie toepassen op een eigenschap die een subeigenschap van het doelobject is. Met andere woorden, als er een eigenschap is van het doelobject dat een object zelf is en dat object eigenschappen heeft, moet u een eigenschapspad definiëren waarin wordt uitgelegd hoe u deze relatie tussen objecten kunt doorlopen. Wanneer u een object opgeeft waarin u een subeigenschap wilt animeren, plaatst u de naam van de eigenschap tussen haakjes ( ) en specificeert u de eigenschap in de formaat typennaam.eigenschapsnaam. Als u bijvoorbeeld wilt opgeven dat u de objectwaarde van de eigenschap RenderTransform van een doelobject wilt opgeven, geeft u '(UIElement.RenderTransform)' op als eerste stap in het eigenschapspad. Dit is nog geen volledig pad, omdat er geen animaties zijn die rechtstreeks op een transformatiewaarde kunnen worden toegepast. Voor dit voorbeeld voltooit u nu het eigenschapspad, zodat de eindeigenschap een eigenschap is van een subklasse Transform die kan worden geanimeerd met een dubbele waarde: "(UIElement.RenderTransform). (CompositeTransform.TranslateX)"
Een bepaald kind in een verzameling opgeven
Als u een sub-item in een verzamelingseigenschap wilt opgeven, kunt u een numerieke index gebruiken. Gebruik vierkante haken []-tekens rond de indexwaarde voor gehele getallen. U kunt alleen verwijzen naar geordende lijsten, geen woordenlijsten. Omdat een verzameling geen waarde is die kan worden geanimeerd, kan een indexeerfunctie nooit de eindeigenschap in een eigenschapspad zijn.
Als u bijvoorbeeld wilt aangeven dat u de eerste kleurstop in een LinearGradientBrush wilt animeren die wordt toegepast op de eigenschap Achtergrond van een controle, is dit het eigenschapspad: "(Control.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)". U ziet dat de indexeerfunctie niet de laatste stap in het pad is en dat de laatste stap met name moet verwijzen naar de eigenschap GradientStop.Color van item 0 in de verzameling om er een kleur-animatiewaarde op toe te passen.
Animatie toevoegen aan een gekoppelde eigenschap
Het is geen veelvoorkomend scenario, maar het is mogelijk om een gekoppelde eigenschap te animeren, zolang die gekoppelde eigenschap een eigenschapswaarde heeft die overeenkomt met een animatietype. Omdat de identificatienaam van een gekoppelde eigenschap al een punt bevat, moet u de naam van een gekoppelde eigenschap tussen haakjes insluiten, zodat de punt niet wordt behandeld als een objecteigenschapsstap. Om aan te geven dat u de gehechte eigenschap Grid.Row op een object wilt animeren, gebruikt u de tekenreeks "(Grid.Row)" als eigenschapspad.
Opmerking
In dit voorbeeld is de waarde van Grid.Row een Eigenschapstype Int32 . U kunt deze dus niet animeren met een dubbele animatie. In plaats daarvan definieert u een ObjectAnimationUsingKeyFrames met discreteObjectKeyFrame-onderdelen , waarbij de ObjectKeyFrame.Value is ingesteld op een geheel getal, zoals '0' of '1'.
Regels voor eigenschappen in een animatie die een eigenschapspad targeten
- Het uitgangspunt van het eigenschapspad is het object dat wordt geïdentificeerd door een Storyboard.TargetName.
- Alle objecten en eigenschappen waarnaar wordt verwezen langs het eigenschappenpad moeten openbaar zijn.
- De eindeigenschap (de eigenschap die de laatste benoemde eigenschap in het pad is) moet openbaar zijn, lezen/schrijven zijn en een afhankelijkheidseigenschap zijn.
- De eindeigenschap moet een eigenschapstype hebben dat kan worden geanimeerd door een van de brede klassen animatietypen (kleuranimaties , dubbele animaties, puntanimaties , ObjectAnimationUsingKeyFrames).
De klasse PropertyPath
De eigenschapsklasse PropertyPath is het onderliggende eigenschapstype binding.path voor het bindingsscenario.
Meestal kunt u een PropertyPath in XAML toepassen zonder code te gebruiken. In sommige gevallen kunt u echter een PropertyPath-object definiëren met behulp van code en deze toewijzen aan een eigenschap tijdens runtime.
PropertyPath heeft een PropertyPath(String) -constructor en heeft geen standaardconstructor. De tekenreeks die u aan deze constructor doorgeeft, is een tekenreeks die is gedefinieerd met behulp van de syntaxis van het eigenschapspad, zoals eerder is uitgelegd. Dit is ook dezelfde tekenreeks die u zou gebruiken om Pad toe te wijzen als een XAML-kenmerk. De enige andere API van de EigenschapPath-klasse is de eigenschap Path , die alleen-lezen is. U kunt deze eigenschap gebruiken als de constructiestring voor een ander PropertyPath-exemplaar.
Verwante onderwerpen
Windows developer