Metadata för beroendeegenskap (WPF .NET)
Egenskapssystemet för Windows Presentation Foundation (WPF) innehåller ett rapporteringssystem för metadata för beroendeegenskap. Den information som är tillgänglig via metadatarapporteringssystemet överskrider vad som är tillgängligt genom reflektion eller allmänna CLR-egenskaper (Common Language Runtime). När du registrerar en beroendeegenskap kan du skapa och tilldela metadata till den. Om du härleder från en klass som definierar en beroendeegenskap kan du åsidosätta metadata för den ärvda beroendeegenskapen. Och om du lägger till din klass som ägare av en beroendeegenskap kan du åsidosätta metadata för den ärvda beroendeegenskapen.
Förutsättningar
Artikeln förutsätter grundläggande kunskaper om beroendeegenskaper och att du har läst Översikt över beroendeegenskaper. Om du vill följa exemplen i den här artikeln hjälper det om du är bekant med XAML (Extensible Application Markup Language) och vet hur du skriver WPF-program.
Så här används metadata
Du kan göra en förfrågan av beroendeegenskaps metadata för att undersöka dess egenskaper. När egenskapssystemet bearbetar en beroendeegenskap kommer den åt dess metadata. Metadataobjektet för en beroendeegenskap innehåller följande typer av information:
Standardvärdet för beroendeegenskapen, som anges av egenskapssystemet när inget annat värde gäller, till exempel ett lokalt värde, ett format eller arvsvärde. Mer information om värdes prioritet vid tilldelning av beroendeegenskapsvärden under körning finns i Hierarkin för beroendeegenskapsvärden.
Referenser till återanrop för tvingningsvärde och återanrop för egenskapsändringar på ägartypen. Du kan bara hämta referenser till callbackfunktioner som har en
public
åtkomstmodifierare eller som ligger inom din tillåtna åtkomstnivå. Mer information om återanrop för beroende egenskap hittar du i Återanrop och validering av beroende egenskaper.Egenskaper för WPF-beroenden på ramverksnivå (om beroendeegenskapen är en WPF-ramverksegenskap). WPF-processer, till exempel layoutmotorn i ramverket och arvslogiken för egenskaper, hämtar WPF-metadata på ramverksnivån. Mer information finns i Framework-egenskapsmetadata.
API:er för metadata
Klassen PropertyMetadata lagrar de flesta metadata som används av egenskapssystemet. Metadatainstanser kan skapas och tilldelas av:
Typer som registrerar beroendeegenskaper med egenskapssystemet.
Typer som ärver från en klass som definierar en beroendeegenskap.
Typer som lägger till sig själva som ägare till en beroendeegenskap.
Om en typ registrerar en beroendeegenskap utan att ange metadata tilldelar egenskapssystemet ett PropertyMetadata
objekt med standardvärden för den typen till beroendeegenskapen.
Om du vill hämta metadata för en beroendeegenskap anropar du en av de GetMetadata överlagringarna på DependencyProperty identifieraren. Metadata returneras som ett PropertyMetadata
objekt.
Mer specifika metadataklasser, härledda från PropertyMetadata
, finns för olika arkitekturområden.
UIPropertyMetadata stöder till exempel animeringsrapportering och FrameworkPropertyMetadata stöder WPF-ramverksegenskaper. Beroendeegenskaper kan också registreras med de PropertyMetadata
härledda klasserna. Även om GetMetadata
returnerar ett PropertyMetadata
objekt kan du i förekommande fall casta till en härledd typ för att undersöka typspecifika egenskaper.
Egenskaper som exponeras av FrameworkPropertyMetadata
kallas ibland flaggor. När du skapar en FrameworkPropertyMetadata
instans kan du skicka en instans av uppräkningstypen FrameworkPropertyMetadataOptions till FrameworkPropertyMetadata
konstruktorn.
FrameworkPropertyMetadataOptions
låter dig ange metadata-flaggor i bitvis kombination.
FrameworkPropertyMetadata
använder FrameworkPropertyMetadataOptions
för att hålla längden på konstruktorns signatur rimlig. Vid registrering av beroendeegenskaper exponeras de metadataflaggor som du anger på FrameworkPropertyMetadataOptions
inom FrameworkPropertyMetadata
som Boolean
-egenskaper istället för som en bitvis kombination av flaggor, för att göra det mer intuitivt att söka efter metadataegenskaper.
Vill du åsidosätta eller skapa nya metadata?
När du ärver en beroendeegenskap kan du ändra egenskaperna för beroendeegenskapen genom att åsidosätta dess metadata. Men du kanske inte alltid kan utföra ditt beroendeegenskapsscenario genom att åsidosätta metadata, och ibland är det nödvändigt att definiera en anpassad beroendeegenskap i klassen med nya metadata. Anpassade beroendeegenskaper har samma funktioner som beroendeegenskaper som definieras av WPF-typer. Mer information finns i Anpassade beroendeegenskaper.
En egenskap för en beroendeegenskap som du inte kan åsidosätta är dess värdetyp. Om en ärvd beroendeegenskap har det ungefärliga beteende du behöver, men ditt scenario kräver en annan värdetyp, bör du överväga att implementera en anpassad beroendeegenskap. Du kanske kan länka egenskapsvärdena via typkonvertering eller annan implementering i din härledda klass.
Scenarier för att åsidosätta metadata
Exempelscenarier för att åsidosätta befintliga beroendeegenskapsmetadata är:
Ändra standardvärdet, vilket är ett vanligt scenario.
Ändra eller lägga till återanrop till egenskapsändringar, vilket kan vara nödvändigt om en ärvd beroendeegenskap interagerar med andra beroendeegenskaper på ett annat sätt än dess grundläggande implementering gör. En av egenskaperna för en programmeringsmodell som stöder både kod och markering är att egenskapsvärden kan anges i valfri ordning. Den här faktorn kan påverka hur du implementerar återanrop för egenskapsändringar. För mer information, se beroendeegenskapers återanrop och validering.
Ändra WPF ramverksegenskapsmetadata inställningar. Metadataalternativ anges vanligtvis vid registrering av en ny beroendeegenskap, men du kan ange dem igen i OverrideMetadata- eller AddOwner-anrop. Mer information om att åsidosätta framework-egenskapsmetadata finns i Ange FrameworkPropertyMetadata. Information om hur du anger metadataalternativ för framework-egenskaper när du registrerar en beroendeegenskap finns i Anpassade beroendeegenskaper.
Not
Eftersom valideringsåteranrop inte ingår i metadata kan de inte ändras genom att åsidosätta metadata. Mer information finns i valideringsvärdeåteranrop.
Åsidosätta metadata
När du implementerar en ny beroendeegenskap kan du ange dess metadata med hjälp av överlagringar av metoden Register. Om klassen ärver en beroendeegenskap kan du åsidosätta ärvda metadatavärden med hjälp av metoden OverrideMetadata. Du kan till exempel använda OverrideMetadata
för att ange typspecifika värden. Mer information och kodexempel finns i Åsidosätt metadata för en beroendeegenskap.
Ett exempel på en WPF-beroendeegenskap är Focusable. Klassen FrameworkElement registrerar Focusable
. Klassen Control härleds från FrameworkElement
, ärver egenskapen Focusable
beroende och åsidosätter de ärvda egenskapsmetadata. Åsidosättningen ändrar standardegenskapsvärdet från false
till true
, men bevarar andra ärvda metadatavärden.
Eftersom de flesta befintliga beroendeegenskaper inte är virtuella egenskaper skuggar deras ärvda implementering den befintliga medlemmen. När du åsidosätter en metadataeaktör ersätter det nya metadatavärdet antingen det ursprungliga värdet eller så sammanfogas de:
För en DefaultValueersätter det nya värdet det befintliga standardvärdet. Om du inte anger en
DefaultValue
i åsidosättningsmetadata kommer värdet från närmaste överordnade som angavDefaultValue
i metadata.För en PropertyChangedCallbacklagrar standardsammanslagningslogik alla
PropertyChangedCallback
värden i en tabell och alla anropas vid en egenskapsändring. Återanropsordningen bestäms av klassdjupet, där ett återanrop som registrerats av basklassen i hierarkin körs först.För en CoerceValueCallbackersätter det nya värdet det befintliga
CoerceValueCallback
värdet. Om du inte anger enCoerceValueCallback
i överskrivningsmetadata, är värdet hämtat från den närmaste överordnade som angavCoerceValueCallback
i metadata.
Not
Standardsammanfogningslogik implementeras med metoden Merge. Du kan ange anpassad kopplingslogik i en härledd klass som ärver en beroendeegenskap genom att åsidosätta Merge
i den klassen.
Lägg till en klass som ägare
Om du vill "ärva" en beroendeegenskap som är registrerad i en annan klasshierarki använder du metoden AddOwner. Den här metoden används vanligtvis när tilläggsklassen inte härleds från den typ som registrerade beroendeegenskapen. I AddOwner
-anropet kan den tilläggande klassen skapa och tilldela typspecifika metadata för den ärvda beroendeegenskapen. För att vara en fullständig deltagare i egenskapssystemet, via kod och markup, ska den läggande klassen implementera dessa offentliga medlemmar:
Ett fält för beroendeegenskapsidentifierare. Värdet för beroendeegenskapsidentifieraren är returvärdet för
AddOwner
-anropet. Det här fältet ska vara ettpublic static readonly
fält av typen DependencyProperty.En CLR-omslutning som implementerar
get
- ochset
-accessorer. Med hjälp av en egenskapsomslutning kan användare av beroendeegenskaper hämta eller ange värden för beroendeegenskaper, precis som de skulle göra med andra CLR-egenskaper.get
- ochset
-åtkomsterna interagerar med det underliggande egenskapssystemet via DependencyObject.GetValue- och DependencyObject.SetValue-anrop och skickar in beroendeegenskapsidentifieraren som en parameter. Implementera wrappern på samma sätt som du skulle när du registrerar en anpassad beroendeegenskap. Mer information finns i Anpassade beroendeegenskaper
En klass som anropar AddOwner
har samma krav för att exponera objektmodellen för den ärvda beroendeegenskapen som en klass som definierar en ny anpassad beroendeegenskap. För mer information, se Lägg till en ägartyp för en beroendeegenskap.
Metadata för bifogad egenskap
I WPF implementeras de flesta gränssnittsrelaterade kopplade egenskaper för WPF-typer som beroendeegenskaper. Anslutna egenskaper som implementeras som beroendeegenskaper stöder beroendeegenskapsbegrepp, till exempel metadata som härledda klasser kan åsidosätta. Metadata för en bifogad egenskap skiljer sig vanligtvis inte från en beroendeegenskap. Du kan åsidosätta standardvärdet, egenskapsändringsåteranrop och WPF-ramverksegenskaper för den ärvda bifogade egenskapen på instanser av den överordnade klassen. Mer information finns i Kopplade egenskapsmetadata
Not
Använd alltid RegisterAttached för att registrera egenskaper där du anger Inherits i metadata. Även om arv av egenskapsvärde kan verka fungera för icke-kopplade beroendeegenskaper, är värdets arvsbeteende för en icke-kopplad egenskap vid vissa objekt-objekt-divisioner i körningsträdet odefinierat. Egenskapen Inherits
är inte relevant för icke-anslutna egenskaper. Mer information finns i avsnittet RegisterAttached(String, Type, Type, PropertyMetadata)och kommentarer i Inherits.
Lägg till en klass som ägare till en bifogad egenskap
Så här ärver du en bifogad egenskap från en annan klass, men exponerar den som en icke-kopplad beroendeegenskap för klassen:
Anropa AddOwner för att lägga till din klass som ägare av den anslutna bindningsegenskapen.
Tilldela returvärdet för
AddOwner
-anropet till ettpublic static readonly
fält för användning som beroendeegenskapsidentifierare.Definiera en CLR-omslutning som lägger till egenskapen som en klassmedlem och stöder användning av icke-länkade egenskaper.
Se även
.NET Desktop feedback