Översikt över typkonverterare för XAML

Typkonverterare tillhandahåller logik för en objektskrivare som konverterar från en sträng i XAML-markering till specifika objekt i ett objektdiagram. I .NET XAML Services måste typkonverteraren vara en klass som härleds från TypeConverter. Vissa konverterare stöder också XAML-sökvägen för att spara och kan användas för att serialisera ett objekt till ett strängform i serialiseringsmarkering. Det här avsnittet beskriver hur och när typkonverterare i XAML anropas och ger implementeringsråd för metod åsidosättningar av TypeConverter.

Typkonverteringsbegrepp

I följande avsnitt beskrivs grundläggande begrepp om hur XAML använder strängar och hur objektskrivare i .NET XAML Services använder typkonverterare för att bearbeta några av de strängvärden som påträffas i en XAML-källa.

XAML- och strängvärden

När du anger ett attributvärde i en XAML-fil är den första typen av det värdet en sträng i allmän mening och ett strängattributvärde i XML-mening. Även andra primitiver som Double till exempel är initiala strängar till en XAML-processor.

I de flesta fall behöver en XAML-processor två informationsdelar för att bearbeta ett attributvärde. Den första informationen är värdetypen för den egenskap som anges. Alla strängar som definierar ett attributvärde och som bearbetas i XAML måste i slutändan konverteras eller matchas till ett värde av den typen. Om värdet är en primitiv som förstås av XAML-parsern (till exempel ett numeriskt värde) görs ett direkt konverteringsförsök av strängen. Om värdet för attributet refererar till en uppräkning, kontrolleras den angivna strängen efter ett namn som matchar en namngiven konstant i uppräkningen. Om värdet inte är en parser-förstådd primitiv eller ett konstant namn från en uppräkning, måste den tillämpliga typen kunna ange ett värde eller en referens som baseras på en konverterad sträng.

Anmärkning

XAML-språkdirektiv använder inte typkonverterare.

Typomvandlare och markup-extensions

Användning av markeringstillägg måste hanteras av en XAML-processor innan den söker efter egenskapstyp och andra överväganden. Om en egenskap som normalt anges som ett attribut har en typkonvertering, men i ett specifikt fall anges genom en användning av ett markeringstillägg, bearbetas markeringstilläggets funktion först. En vanlig situation där ett markeringstillägg är nödvändigt är att referera till ett objekt som redan finns. I det här scenariot kan en tillståndslös typkonverterare bara generera en ny instans, vilket kanske inte är önskvärt. Mer information om markeringstillägg finns i Markup Extensions for XAML Overview.

Konverterare av ursprunglig typ

I implementeringarna av Windows Presentation Foundation (WPF) och .NET XAML-tjänster finns det vissa CLR-typer som har intern typkonverteringshantering. Dessa CLR-typer betraktas dock inte konventionellt som primitiver. Ett exempel på en sådan typ är DateTime. En orsak till detta är hur .NET Framework-arkitekturen fungerar: typen DateTime definieras i mscorlib, det mest grundläggande biblioteket i .NET. DateTime är inte tillåtet att tillskrivas ett attribut som kommer från en annan sammansättning som introducerar ett beroende (TypeConverterAttribute är från systemet). Därför kan inte den vanliga identifieringsmekanismen för typkonverterare genom attributering stödjas. I stället har XAML-parsern en lista över typer som behöver intern bearbetning, och den bearbetar dessa typer som liknar hur de verkliga primitiverna bearbetas. När det gäller DateTimeinnebär den här bearbetningen ett anrop till Parse.

Implementera en typkonverterare

I följande avsnitt beskrivs klassens TypeConverter API.

Typomvandlare

Under .NET XAML Services är alla typkonverterare som används för XAML-ändamål klasser som härleds från basklassen TypeConverter. Klassen TypeConverter fanns i versioner av .NET Framework innan XAML fanns. Ett av de ursprungliga TypeConverter scenarierna var att tillhandahålla strängkonvertering för egenskapsredigerare i visuella designers.

För XAML utökas rollen för TypeConverter. För XAML-ändamål TypeConverter är basklassen för att ge stöd för vissa konverteringar till strängar och från strängar. Med from-string kan du parsa ett strängattributvärde från XAML. Till-sträng möjliggör bearbetning av ett körtidsvärde för en viss objektegenskap tillbaka till ett attribut i XAML för serialisering.

TypeConverter definierar fyra medlemmar som är relevanta för konvertering till och från strängar för XAML-bearbetning.

Av dessa medlemmar är ConvertFromden viktigaste metoden , som konverterar indatasträngen till den objekttyp som krävs. Metoden ConvertFrom kan implementeras för att konvertera ett bredare antal typer till konverterarens avsedda måltyp. Därför kan det tjäna syften som sträcker sig bortom XAML, till exempel stöd för konverteringar vid körning. Men för XAML-användning är det bara den kodsökväg som kan bearbeta indata String som är viktig.

Den näst viktigaste metoden är ConvertTo. Om ett program konverteras till en markeringsrepresentation (till exempel om det sparas i XAML som en fil) ConvertTo är det involverat i det större scenariot med en XAML-textskrivare för att skapa en markeringsrepresentation. I det här fallet för XAML är det när anroparen skickar en destinationType av String som den viktiga kodsökvägen aktiveras.

CanConvertTo och CanConvertFrom är supportmetoder som används när en tjänst frågar funktionerna i TypeConverter implementeringen. Du måste implementera dessa metoder för att returnera true för typspecifika fall som motsvarande konverteringsmetoder för konverteraren stöder. För XAML-ändamål innebär detta vanligtvis den String typen.

Kulturinformation och typkonverterare för XAML

Varje TypeConverter implementering kan unikt tolka vad som är en giltig sträng för en konvertering, och den kan också använda eller ignorera den typbeskrivning som skickas som parametrar. Ett viktigt övervägande för kultur- och XAML-typkonvertering är följande: Även om användningen av lokaliserbara strängar som attributvärden stöds av XAML, kan du inte använda dessa lokaliserbara strängar som typkonverterarens indata med specifika krav på kultur. Den här begränsningen beror på att typkonverterare för XAML-attributvärden nödvändigtvis inbegriper ett XAML-bearbetningsbeteende med fast språk som använder en-US kultur. Mer information om designorsakerna till den här begränsningen finns i XAML-språkspecifikationen ([MS-XAML]) eller WPF Globalisering och lokaliseringsöversikt.

Som ett exempel där kultur kan vara ett problem använder vissa kulturer ett kommatecken i stället för en punkt som decimalteckenavgränsare för tal i strängform. Den här användningen kolliderar med det beteende som många befintliga typkonverterare har, vilket är att använda ett kommatecken som avgränsare. Att skicka en kultur genom xml:lang i den omgivande XAML-koden löser inte problemet.

Implementera ConvertFrom

För att kunna användas som en TypeConverter implementering som stöder XAML måste ConvertFrom-metoden för konverteraren acceptera en sträng som parametern value. Om strängen är i ett giltigt format och kan konverteras av TypeConverter-implementeringen, måste det returnerade objektet kunna konverteras till den typ som förväntas av egenskapen. Annars måste ConvertFrom-implementeringen returnera null.

Varje TypeConverter implementering kan unikt tolka vad som utgör en giltig sträng för en konvertering, och den kan också använda eller ignorera typbeskrivning eller kulturkontexter som skickas som parametrar. WPF XAML-bearbetningen kanske dock inte skickar värden till typbeskrivningskontexten i alla fall och kanske inte heller skickar kultur baserat på xml:lang.

Anmärkning

Använd inte klammerparenteserna ({}), särskilt den inledande klammerparentesen ({), som ett element i strängformatet. Dessa tecken är reserverade som in- och avslut för en markeringstilläggssekvens.

Det är lämpligt att utlösa ett undantag när typkonverteraren måste ha åtkomst till en XAML-tjänst från .NET XAML Services-objektskrivaren, men GetService det anrop som görs mot kontexten returnerar inte tjänsten.

Implementera ConvertTo

ConvertTo kan användas för serialiseringsstöd. Serialiseringsstöd via ConvertTo för din anpassade typ och dess typkonverterare är inte ett absolut krav. Men om du implementerar en kontroll eller använder serialisering av som en del av funktionerna eller utformningen av klassen bör du implementera ConvertTo.

För att kunna användas som en TypeConverter implementering som stöder XAML ConvertTo måste metoden för konverteraren acceptera en instans av typen (eller ett värde) som stöds som value parameter. När parametern destinationType är av typen Stringmåste det returnerade objektet kunna gjutas som String. Den returnerade strängen måste representera ett serialiserat värde för value. Helst bör det serialiseringsformat som du väljer kunna generera samma värde som om strängen skickades till implementeringen ConvertFrom av samma konverterare, utan betydande informationsförlust.

Om värdet inte kan serialiseras eller om konverteraren inte stöder serialisering ConvertTo måste implementeringen returnera null och kan utlösa ett undantag. Men om du utlöser undantag bör du rapportera om det inte går att använda konverteringen som en del av implementeringen CanConvertTo så att bästa praxis att kontrollera med CanConvertTo först för att undvika undantag stöds.

Om parametern destinationType inte är av typen Stringkan du välja din egen konverterarhantering. Vanligtvis återgår du till grundläggande implementeringshantering, vilket i basen ConvertTo genererar ett specifikt undantag.

Det är lämpligt att utlösa ett undantag när typkonverteraren måste ha åtkomst till en XAML-tjänst från .NET XAML Services-objektskrivaren, men GetService det anrop som görs mot kontexten returnerar inte tjänsten.

Implementera CanConvertFrom

Din CanConvertFrom-implementation ska returnera true för sourceType av typen String och annars förlita sig på basimplementeringen. Kasta inte undantag från CanConvertFrom.

Implementera CanConvertTo

Din CanConvertTo-implementation bör returnera true för destinationType av typen Stringoch i övrigt lämna över till basimplementationen. Kasta inte undantag från CanConvertTo.

Att tillämpa TypeConverterAttribute

För att din anpassade typkonverterare ska användas som verkande typkonverterare för en anpassad klass av .NET XAML Services måste du tillämpa TypeConverterAttribute på klassdefinitionen. Den ConverterTypeName som du anger via attributet måste vara typnamnet för konverteraren av anpassad typ. Om du använder det här attributet, när en XAML-processor hanterar värden där egenskapstypen använder din anpassade klasstyp, kan den mata in strängar och returnera objektinstanser.

Du kan också tillhandahålla en typomvandlare per egenskap. I stället för att tillämpa en TypeConverterAttribute på klassdefinitionen tillämpar du den på en egenskapsdefinition (huvuddefinitionen, inte get/set implementeringar inom den). Egenskapens typ måste matcha den typ som bearbetas av din anpassade typkonverterare. Med det här attributet tillämpat, när en XAML-processor hanterar värden för den egenskapen, kan den bearbeta indatasträngar och returnera objektinstanser. Konverterartekniken per egenskapstyp är användbar om du väljer att använda en egenskapstyp från Microsoft .NET Framework eller från något annat bibliotek där du inte kan styra klassdefinitionen och inte kan tillämpa en TypeConverterAttribute där.

Om du vill ange ett typkonverteringsbeteende för en anpassad bunden medlem, använd TypeConverterAttribute för metoden för tillgång till implementeringsmönstret för den anslutna medlemmen.

Åtkomst till tjänstleverantörskontext från en implementering av markeringstillägg

De tillgängliga tjänsterna är desamma för alla värdekonverterare. Skillnaden är hur varje värdekonverterare tar emot tjänstkontexten. Åtkomst till tjänster och tillgängliga tjänster dokumenteras i avsnittet Type Converters and Markup Extensions for XAML.

Skriv konverterare i XAML-nodströmmen

Om du arbetar med en XAML-nodström körs inte åtgärden eller slutresultatet av en typkonverterare ännu. I en inläsningssökväg förblir attributsträngen som så småningom måste typkonverteras för att läsas in som ett textvärde inom en startmedlem och en slutmedlem. Den typkonverterare som slutligen behövs för den här åtgärden kan fastställas med hjälp av egenskapen XamlMember.TypeConverter. Att hämta ett giltigt värde från XamlMember.TypeConverter bygger dock på att ha en XAML-schemakontext, som kan komma åt sådan information via den underliggande medlemmen eller typen av objektvärde som medlemmen använder. För att anropa typkonverteringsbeteendet krävs även XAML-schemakontexten eftersom det kräver typmappning och skapandet av en konverterarinstans.

Se även