Delen via


Metagegevens van afhankelijkheidseigenschappen

Het WPF-eigenschappensysteem (Windows Presentation Foundation) bevat een rapportagesysteem voor metagegevens van afhankelijke eigenschappen. De informatie die beschikbaar is via het rapportagesysteem voor metagegevens overschrijdt wat beschikbaar is via reflectie of algemene CLR-kenmerken (Common Language Runtime). Wanneer u een afhankelijkheidseigenschap registreert, hebt u de mogelijkheid om er metagegevens aan te maken en toe te wijzen. Als u bent afgeleid van een klasse die een afhankelijkheidseigenschap definieert, kunt u de metagegevens voor de overgenomen afhankelijkheidseigenschap overschrijven. En als u uw klasse toevoegt als eigenaar van een afhankelijkheidseigenschap, kunt u de metagegevens van de overgenomen afhankelijkheidseigenschap overschrijven.

Vereiste voorwaarden

In het artikel wordt ervan uitgegaan dat u basiskennis hebt van afhankelijkheidseigenschappen en dat u overzicht van eigenschappen van afhankelijkheden hebt gelezen. Als u de voorbeelden in dit artikel wilt volgen, helpt dit als u bekend bent met Extensible Application Markup Language (XAML) en weet hoe u WPF-toepassingen schrijft.

Hoe metagegevens worden gebruikt

U kunt metagegevens van afhankelijkheden opvragen om de kenmerken van een afhankelijkheidseigenschap te onderzoeken. Wanneer het eigenschappensysteem een afhankelijkheidseigenschap verwerkt, heeft het toegang tot de metagegevens. Het metagegevensobject voor een afhankelijkheidseigenschap bevat de volgende typen informatie:

  • De standaardwaarde van de afhankelijkheidseigenschap, die wordt ingesteld door het eigenschapssysteem wanneer er geen andere waarde van toepassing is, zoals een lokale, stijl of overnamewaarde. Zie voor meer informatie over waardeprioriteit tijdens runtimetoewijzing van afhankelijkheidseigenschapswaarden prioriteit van eigenschapswaarde voor afhankelijkheden.

  • Verwijzingen naar callbacks van omzettingswaarden en callbacks voor eigenschapswijziging van het eigenaartype. U kunt alleen verwijzingen verkrijgen naar callbacks met een public toegangsmodifier of die binnen uw toegestane toegangsbereik vallen. Zie Callbacks van afhankelijkheidseigenschappen en validatievoor meer informatie over callbacks van afhankelijkheidseigenschappen.

  • Kenmerken van afhankelijkheidseigenschappen op WPF-frameworkniveau (als de afhankelijkheidseigenschap een WPF-frameworkeigenschap is). WPF-processen, zoals de framework layout-engine en de logica voor overname van eigenschappen, query's uitvoeren op metagegevens op WPF-frameworkniveau. Zie Framework-eigenschappenmetagegevensvoor meer informatie.

Metagegevens-API's

De PropertyMetadata klasse slaat de meeste metagegevens op die worden gebruikt door het eigenschappensysteem. Metagegevensexemplaren kunnen worden gemaakt en toegewezen door:

  • Typen die afhankelijkheidseigenschappen registreren bij het eigenschappensysteem.

  • Typen die overnemen van een klasse die een afhankelijkheidseigenschap definieert.

  • Typen die zichzelf als eigenaar van een afhankelijkheidseigenschap toevoegen.

Als een type een afhankelijkheidseigenschap registreert zonder metagegevens op te geven, wijst het eigenschappensysteem een PropertyMetadata-object toe met standaardwaarden voor dat type aan de eigenschap afhankelijkheid.

Om metagegevens voor een afhankelijkheidseigenschap op te halen, roept u een van de GetMetadata overbelastingen aan op de DependencyProperty-identificator. De metagegevens worden geretourneerd als een PropertyMetadata-object.

Meer specifieke metagegevensklassen, afgeleid van PropertyMetadata, bestaan voor verschillende architectuurgebieden. UIPropertyMetadata ondersteunt bijvoorbeeld animatierapportage en FrameworkPropertyMetadata ondersteunt WPF-frameworkeigenschappen. Afhankelijkheidseigenschappen kunnen ook worden geregistreerd bij de PropertyMetadata afgeleide klassen. Hoewel GetMetadata een PropertyMetadata-object retourneert, kunt u, indien van toepassing, casten naar een afgeleid type om typespecifieke eigenschappen te onderzoeken.

De eigenschappen die door FrameworkPropertyMetadata worden weergegeven, worden soms aangeduid als vlaggen. Wanneer u een FrameworkPropertyMetadata exemplaar maakt, kunt u een exemplaar van het opsommingstype FrameworkPropertyMetadataOptions doorgeven aan de FrameworkPropertyMetadata constructor. FrameworkPropertyMetadataOptions kunt u metagegevensvlagmen opgeven in bitsgewijze combinatie. De FrameworkPropertyMetadata gebruikt FrameworkPropertyMetadataOptions om de lengte van de constructorsignatuur binnen de perken te houden. Bij registratie van afhankelijkheidseigenschappen worden de metagegevensvlagmen die u hebt ingesteld op FrameworkPropertyMetadataOptions weergegeven in FrameworkPropertyMetadata als Boolean eigenschappen in plaats van een bitsgewijze combinatie van vlaggen, om het uitvoeren van query's op metagegevenskenmerken intuïtiever te maken.

Nieuwe metagegevens overschrijven of maken?

Wanneer u een afhankelijkheidseigenschap overneemt, hebt u de mogelijkheid om kenmerken van de afhankelijkheidseigenschap te wijzigen door de metagegevens ervan te overschrijven. Het is echter mogelijk dat u uw scenario met afhankelijkheden niet altijd kunt uitvoeren door metagegevens te overschrijven. Soms is het nodig om een aangepaste afhankelijkheidseigenschap in uw klasse te definiëren met nieuwe metagegevens. Aangepaste afhankelijkheidseigenschappen hebben dezelfde mogelijkheden als afhankelijkheidseigenschappen die zijn gedefinieerd door WPF-typen. Zie Aangepaste afhankelijkheidseigenschappenvoor meer informatie.

Een kenmerk van een afhankelijkheidseigenschap die u niet kunt overschrijven, is het waardetype. Als een overgenomen afhankelijkheidseigenschap het gedrag heeft dat u nodig hebt, maar voor uw scenario een ander waardetype is vereist, kunt u overwegen om een aangepaste afhankelijkheidseigenschap te implementeren. Mogelijk kunt u de eigenschapswaarden koppelen via typeconversie of andere implementatie in uw afgeleide klasse.

Scenario's voor het overschrijven van metagegevens

Voorbeeldscenario's voor het overschrijven van bestaande metagegevens van afhankelijkheden zijn:

  • De standaardwaarde wijzigen. Dit is een veelvoorkomend scenario.

  • Callbacks voor eigenschapswijziging wijzigen of toevoegen, wat mogelijk nodig is als een overgenomen afhankelijkheidseigenschap communiceert met andere afhankelijkheidseigenschappen anders dan de basis-implementatie. Een van de kenmerken van een programmeermodel dat zowel code als markeringen ondersteunt, is dat eigenschapswaarden in elke volgorde kunnen worden ingesteld. Deze factor kan van invloed zijn op de wijze waarop u callbacks voor eigenschapswijziging implementeert. Voor meer informatie, zie afhankelijkheidseigenschap callbacks en validatie.

  • Metagegevens van WPF-frameworkeigenschappen wijzigen,-opties aanpassen. Metagegevensopties worden doorgaans ingesteld tijdens de registratie van een nieuwe afhankelijkheidseigenschap, maar u kunt ze opnieuw specificeren in OverrideMetadata- of AddOwner-oproepen. Zie FrameworkPropertyMetadata specificerenvoor meer informatie over het overschrijven van metagegevens van frameworkeigenschappen. Zie Aangepaste afhankelijkheidseigenschappenvoor hoe u opties voor metadata van frameworkeigenschappen instelt bij het registreren van een afhankelijkheidseigenschap.

Opmerking

Omdat callbacks voor validatie geen deel uitmaken van metagegevens, kunnen ze niet worden gewijzigd door metagegevens te overschrijven. Zie Validatiewaarde-callbacksvoor meer informatie.

Metagegevens overschrijven

Wanneer u een nieuwe afhankelijkheidseigenschap implementeert, kunt u de metagegevens ervan instellen met behulp van overbelastingen van de Register methode. Als uw klasse een afhankelijkheidseigenschap overschrijft, kunt u overgenomen metagegevenswaarden overschrijven met behulp van de methode OverrideMetadata. U kunt bijvoorbeeld OverrideMetadata gebruiken om typespecifieke waarden in te stellen. Zie Metagegevens overschrijven voor een afhankelijkheidseigenschapvoor meer informatie en codevoorbeelden.

Een voorbeeld van een WPF-afhankelijkheidseigenschap is Focusable. De FrameworkElement-class registreert Focusable. De Control-klasse is afgeleid van FrameworkElement, neemt de Focusable afhankelijkheidseigenschap over en overschrijft de overgenomen metagegevens van eigenschappen. De overschrijving wijzigt de standaardeigenschapswaarde van false in true, maar behoudt andere overgenomen metagegevenswaarden.

Omdat de meeste bestaande afhankelijkheidseigenschappen geen virtuele eigenschappen zijn, worden hun overgenomen implementaties overschreven door het bestaande lid. Wanneer u een metagegevenskenmerk overschrijft, vervangt de nieuwe metagegevenswaarde de oorspronkelijke waarde of worden ze samengevoegd:

  • Voor een DefaultValuevervangt de nieuwe waarde de bestaande standaardwaarde. Als u geen DefaultValue opgeeft in de override metagegevens, wordt de waarde gehaald uit het dichtstbijzijnde bovenliggende niveau dat DefaultValue in de metagegevens heeft gespecificeerd.

  • Voor een PropertyChangedCallbackworden in de standaardlogica voor samenvoegen alle PropertyChangedCallback waarden in een tabel opgeslagen en worden alle waarden aangeroepen bij een eigenschapswijziging. De callback-order wordt bepaald door klassediepte, waarbij een callback die is geregistreerd door de basisklasse in de hiërarchie eerst wordt uitgevoerd.

  • Voor een CoerceValueCallbackvervangt de nieuwe waarde de bestaande CoerceValueCallback waarde. Als u geen CoerceValueCallback opgeeft in de override metagegevens, wordt de waarde gehaald uit het dichtstbijzijnde bovenliggende niveau dat CoerceValueCallback in de metagegevens heeft gespecificeerd.

Opmerking

De standaardsamenvoeglogica wordt geïmplementeerd door de methode Merge. U kunt aangepaste samenvoeglogica opgeven in een afgeleide klasse die een afhankelijkheidseigenschap erft, door Merge in die klasse te overschrijven.

Een klasse toevoegen als eigenaar

Als u een afhankelijkheidseigenschap wilt overnemen die is geregistreerd in een andere klassehiërarchie, gebruikt u de methode AddOwner. Deze methode wordt meestal gebruikt wanneer de toevoegingsklasse niet wordt afgeleid van het type dat de afhankelijkheidseigenschap heeft geregistreerd. In de AddOwner-aanroep kan de toevoegingsklasse typespecifieke metagegevens maken en toewijzen voor de overgenomen afhankelijkheidseigenschap. Om een volwaardige deelnemer in het eigendomssysteem te zijn, door middel van code en mark-up, moet de toevoegklas deze openbare leden implementeren:

  • Een veld voor de id van een afhankelijkheidseigenschap. De waarde van de identificatie van de afhankelijkheidseigenschap is de retourwaarde van de oproep AddOwner. Dit veld moet een public static readonly veld van het type DependencyPropertyzijn.

  • Een CLR-wrapper die get en set accessors implementeert. Met behulp van een property wrapper kunnen gebruikers van afhankelijke eigenschappen waarden van afhankelijkheidseigenschappen ophalen of instellen, zoals bij elke andere CLR-eigenschap. De get en set accessors communiceren met het onderliggende eigenschapssysteem via DependencyObject.GetValue en DependencyObject.SetValue aanroepen, waarbij de id van de afhankelijkheidseigenschap als parameter wordt doorgegeven. Implementeer de wrapper op dezelfde manier als bij het registreren van een aangepaste afhankelijkheidseigenschap. Zie Eigenschappen van aangepaste afhankelijkheden voor meer informatie

Een klasse die AddOwner aanroept, heeft dezelfde vereisten voor het blootstellen van het objectmodel van de overgenomen afhankelijkheidseigenschap als een klasse die een nieuwe aangepaste afhankelijkheidseigenschap definieert. Zie Een type eigenaar toevoegen voor een afhankelijkheidseigenschap voor meer informatie

Metagegevens van gekoppelde eigenschap

In WPF worden de meeste aan de gebruikersinterface gerelateerde gekoppelde eigenschappen op WPF-typen geïmplementeerd als afhankelijkheidseigenschappen. Gekoppelde eigenschappen die zijn geïmplementeerd als afhankelijkheidseigenschappen ondersteunen concepten van afhankelijkheden, zoals metagegevens die afgeleide klassen kunnen overschrijven. Metagegevens voor een gekoppelde eigenschap zijn over het algemeen niet anders dan voor een afhankelijkheidseigenschap. U kunt de standaardwaarde, callbacks voor eigenschapswijziging en WPF-frameworkeigenschappen voor de geërfde gekoppelde eigenschap overschrijven op exemplaren van de overnemende klasse. Zie voor meer informatie metagegevens van gekoppelde eigenschappen

Opmerking

Gebruik altijd RegisterAttached om eigenschappen te registreren waar u Inherits opgeeft in de metagegevens. Hoewel overname van eigenschapswaarden kan werken voor niet-gekoppelde afhankelijkheidseigenschappen, is het gedrag van de overname van waarden voor een niet-gekoppelde eigenschap via bepaalde objectobjectverdelingen in de runtimestructuur niet gedefinieerd. De eigenschap Inherits is niet relevant voor niet-gekoppelde eigenschappen. Zie RegisterAttached(String, Type, Type, PropertyMetadata)en het gedeelte opmerkingen van Inheritsvoor meer informatie.

Een klasse toevoegen als eigenaar van een gekoppelde eigenschap

Als u een gekoppelde eigenschap van een andere klasse wilt overnemen, maar deze wilt weergeven als een niet-gekoppelde afhankelijkheidseigenschap voor uw klasse:

  • Roep AddOwner aan om uw klasse toe te voegen als eigenaar van de gekoppelde afhankelijkheidseigenschap.

  • Wijs de retourwaarde van de AddOwner-aanroep toe aan een public static readonly veld, voor gebruik als id van de afhankelijkheidseigenschap.

  • Definieer een CLR-wrapper, waarmee de eigenschap als klasselid wordt toegevoegd en het gebruik van niet-gekoppelde eigenschappen wordt ondersteund.

Zie ook