Overzicht van typeconversieprogramma's voor XAML

Typeconversieprogramma's leveren logica voor een objectschrijver die wordt geconverteerd van een tekenreeks in XAML-markeringen naar bepaalde objecten in een objectgrafiek. In .NET XAML Services moet het typeconversieprogramma een klasse zijn die is afgeleid van TypeConverter. Sommige conversieprogramma's ondersteunen ook het XAML-opslagpad en kunnen worden gebruikt om een object te serialiseren in de vorm van een tekenreeks met serialisatieopmaak. In dit onderwerp wordt beschreven hoe en wanneer typeconversieprogramma's in XAML worden aangeroepen en wordt implementatieadvies geboden voor de methodeoverschrijvingen van TypeConverter.

Concepten voor typeconversie

In de volgende secties worden basisconcepten uitgelegd over hoe XAML tekenreeksen gebruikt en hoe objectschrijvers in .NET XAML Services typeconversieprogramma's gebruiken om enkele tekenreekswaarden te verwerken die in een XAML-bron zijn opgetreden.

XAML- en tekenreekswaarden

Wanneer u een kenmerkwaarde instelt in een XAML-bestand, is het eerste type van die waarde een tekenreeks in algemene zin en een waarde van het tekenreekskenmerk in xml-zin. Zelfs andere primitieven zoals Double zijn in eerste instantie tekenreeksen naar een XAML-processor.

In de meeste gevallen heeft een XAML-processor twee stukjes informatie nodig om een kenmerkwaarde te verwerken. Het eerste stukje informatie is het waardetype van de eigenschap die wordt ingesteld. Elke tekenreeks die een kenmerkwaarde definieert en die wordt verwerkt in XAML, moet uiteindelijk worden geconverteerd of omgezet in een waarde van dat type. Als de waarde een primitieve is die wordt begrepen door de XAML-parser (zoals een numerieke waarde), wordt een directe conversie van de tekenreeks geprobeerd. Als de waarde voor het kenmerk verwijst naar een opsomming, wordt de opgegeven tekenreeks gecontroleerd op een naam die overeenkomt met een benoemde constante in die opsomming. Als de waarde geen door een parser begrepen primitief of een constante naam uit een opsomming is, moet het toepasselijke type een waarde of verwijzing kunnen geven die gebaseerd is op een geconverteerde tekenreeks.

Notitie

XAML-taalrichtlijnen gebruiken geen typeconversieprogramma's.

Conversieprogramma's en uitbreidingen voor markeringen typen

Gebruik van markup-extensie moet worden verwerkt door een XAML-processor voordat wordt gecontroleerd op het type eigenschap en andere overwegingen. Als een eigenschap die wordt ingesteld als een kenmerk normaal gesproken een typeconversie heeft, maar in een bepaald geval wordt ingesteld door het gebruik van een markeringsextensie, wordt het gedrag van de markeringsuitbreiding eerst verwerkt. Een veelvoorkomende situatie waarbij een markeringsextensie nodig is, is om een verwijzing te maken naar een object dat al bestaat. Voor dit scenario kan een staatloze typeconversieprogramma alleen een nieuw exemplaar genereren, wat mogelijk niet wenselijk is. Zie Markup Extensions for XAML Overviewvoor meer informatie over markeringsextensies.

Systeemeigen typeconverters

In de implementaties van Windows Presentation Foundation (WPF) en .NET XAML-services zijn er bepaalde CLR-typen die beschikken over een eigen afhandeling van typeconversies. Deze CLR-typen worden echter niet conventioneel beschouwd als primitieven. Een voorbeeld van een dergelijk type is DateTime. Een van de redenen hiervoor is hoe de .NET Framework-architectuur werkt: het type DateTime is gedefinieerd in mscorlib, de meest eenvoudige bibliotheek in .NET. DateTime mag niet worden toegeschreven aan een kenmerk dat afkomstig is van een andere assembly die een afhankelijkheid introduceert (TypeConverterAttribute afkomstig is van Systeem). Daarom kan het gebruikelijke mechanisme voor het ontdekken van typeconverters door middel van toewijzing van attributen niet worden ondersteund. In plaats daarvan heeft de XAML-parser een lijst met typen die systeemeigen verwerking nodig hebben en deze worden verwerkt zoals de werkelijke primitieven worden verwerkt. In het geval van DateTimeomvat deze verwerking een aanroep naar Parse.

Een typeconversieprogramma implementeren

In de volgende secties wordt de API van de TypeConverter-klasse besproken.

Type Converter

Onder .NET XAML Services zijn alle type conversieprogramma's die worden gebruikt voor XAML-doeleinden klassen die zijn afgeleid van de basisklasse TypeConverter. De TypeConverter-klasse bestond in versies van het .NET Framework voordat XAML bestond; een van de oorspronkelijke TypeConverter-scenario's was om stringconversie te bieden voor eigenschapseditors in visuele ontwerpsoftware.

Voor XAML wordt de rol van TypeConverter uitgebreid. Voor XAML-doeleinden is TypeConverter de basisklasse die ondersteuning biedt voor bepaalde conversies naar en van tekenreeksen. Met from-string kan een tekenreekskenmerkwaarde uit XAML worden geparseerd. To-string kan het verwerken van een runtimewaarde van een bepaalde objecteigenschap weer in een kenmerk in XAML mogelijk maken voor serialisatie.

TypeConverter definieert vier leden die relevant zijn voor het converteren naar en van string voor XAML-verwerkingsdoeleinden:

Van deze leden is de belangrijkste methode ConvertFrom, waarmee de invoertekenreeks wordt geconverteerd naar het vereiste objecttype. De methode ConvertFrom kan worden geïmplementeerd om een breder scala aan typen te converteren naar het beoogde doeltype van het conversieprogramma. Daarom kan het doelen dienen die verder gaan dan XAML, zoals het ondersteunen van runtimeconversies. Voor het gebruik van XAML is echter alleen het codepad dat een String invoer kan verwerken belangrijk.

De tweede belangrijkste methode is ConvertTo. Als een toepassing wordt geconverteerd naar een opmaakweergave (bijvoorbeeld als deze als bestand wordt opgeslagen in XAML), wordt ConvertTo betrokken bij het grotere scenario van een XAML-tekstschrijver om een opmaakweergave te produceren. In dit geval is het belangrijke codepad voor XAML wanneer de aanroeper een destinationType van Stringdoorgeeft.

CanConvertTo en CanConvertFrom zijn ondersteuningsmethoden die worden gebruikt wanneer een service de mogelijkheden van de TypeConverter-implementatie opvraagt. U moet deze methoden implementeren om true te retourneren voor typespecifieke gevallen die de equivalente conversiemethoden van uw conversieprogramma ondersteunen. Voor XAML-doeleinden betekent dit over het algemeen het String type.

Cultuurinformatie en typeconversieprogramma's voor XAML

Elke TypeConverter-implementatie kan uniek interpreteren wat een geldige tekenreeks is voor een conversie en kan ook de typebeschrijving gebruiken of negeren die wordt doorgegeven als parameters. Een belangrijke overweging voor cultuur- en XAML-typeconversie is het volgende: hoewel het gebruik van lokaliseerbare tekenreeksen als kenmerkwaarden wordt ondersteund door XAML, kunt u deze lokaliseerbare tekenreeksen niet gebruiken als invoer van typeconversieprogramma's met specifieke cultuurvereisten. Deze beperking komt doordat typeconversieprogramma's voor XAML-kenmerkwaarden een noodzakelijkerwijs XAML-verwerkingsgedrag met vaste taal omvatten dat gebruikmaakt van en-US cultuur. Zie de XAML-taalspecificatie ([MS-XAML]) of WPF Globalization and Localization Overviewvoor meer informatie over de ontwerpredenen voor deze beperking.

Als voorbeeld waarbij cultuur een probleem kan zijn, gebruiken sommige culturen een komma in plaats van een punt als het scheidingsteken voor decimalen voor getallen in tekenreeksvorm. Dit gebruik botst met het gedrag dat veel bestaande typeconversieprogramma's hebben, namelijk het gebruik van een komma als scheidingsteken. Het doorgeven van een cultuur via xml:lang in de omringende XAML lost het probleem niet op.

ConvertFrom implementeren

Om bruikbaar te zijn als een TypeConverter-implementatie die XAML ondersteunt, moet de methode ConvertFrom van die converter een tekenreeks als de parameter value accepteren. Als de tekenreeks een geldige indeling heeft en kan worden geconverteerd door de TypeConverter-implementatie, moet het geretourneerde object omgezet kunnen worden naar het type dat door de eigenschap wordt verwacht. Anders moet de ConvertFrom-implementatie nullretourneren.

Elke TypeConverter-implementatie kan op unieke wijze interpreteren wat een geldige tekenreeks voor een conversie is en kan ook de typebeschrijving of cultuurcontexten gebruiken of negeren die als parameters worden doorgegeven. De WPF XAML-verwerking geeft in alle gevallen echter geen waarden door aan de context van de typebeschrijving en kan ook geen cultuur doorgeven op basis van xml:lang.

Notitie

Gebruik de accolades ({}) niet, met name de openingsaccolade ({), als element in de indeling van je tekenreeks. Deze tekens zijn gereserveerd als de begin- en eindtekens voor een markeringsextensievolgorde.

Het is geschikt om een uitzondering te genereren wanneer uw typeconversieprogramma toegang moet hebben tot een XAML-service van .NET XAML Services-objectschrijver, maar de GetService aanroep die wordt uitgevoerd op basis van de context, retourneert die service niet.

ConvertTo implementeren

ConvertTo wordt mogelijk gebruikt voor serialisatieondersteuning. Serialisatieondersteuning via ConvertTo voor uw aangepaste type en de bijbehorende typeconverter is niet absoluut vereist. Als u echter een besturingselement implementeert of serialisatie gebruikt als onderdeel van de functies of het ontwerp van uw klasse, moet u ConvertToimplementeren.

Om bruikbaar te zijn als een TypeConverter-implementatie die XAML ondersteunt, moet de ConvertTo-methode voor die converter een exemplaar van het type (of een waarde) accepteren dat wordt ondersteund als de value-parameter. Wanneer de parameter destinationType van het type Stringis, moet het geretourneerde object als Stringkunnen worden gecast. De geretourneerde tekenreeks moet een geserialiseerde waarde van valuevertegenwoordigen. In het ideale geval moet de serialisatie-indeling die u kiest, dezelfde waarde kunnen genereren als als die tekenreeks is doorgegeven aan de ConvertFrom implementatie van hetzelfde conversieprogramma, zonder dat er veel gegevens verloren gaan.

Als de waarde niet kan worden geserialiseerd of het conversieprogramma geen ondersteuning biedt voor serialisatie, moet de ConvertTo-implementatie null retourneren en kan er een uitzondering worden gegenereerd. Als u echter uitzonderingen genereert, moet u melden dat deze conversie niet kan worden gebruikt als onderdeel van uw CanConvertTo-implementatie, zodat de aanbevolen procedure voor het controleren met CanConvertTo eerst wordt ondersteund om uitzonderingen te voorkomen.

Als de parameter destinationType niet van het type Stringis, kunt u dan zelf de convertorverwerking kiezen. Normaal gesproken maak je gebruik van basisimplementatieverwerking, die in de basis ConvertTo een specifieke uitzondering opwerpt.

Het is geschikt om een uitzondering te genereren wanneer uw typeconversieprogramma toegang moet hebben tot een XAML-service van .NET XAML Services-objectschrijver, maar de GetService aanroep die wordt uitgevoerd op basis van de context, retourneert die service niet.

CanConvertFrom implementeren

Uw CanConvertFrom-implementatie moet true retourneren voor sourceType van het type String en anders doorverwijzen naar de basisimplementatie. Gooi geen uitzonderingen uit CanConvertFrom.

CanConvertTo implementeren

Uw CanConvertTo-implementatie moet true retourneren voor destinationType van het type Stringen anders verwijzen naar de basisimplementatie. Gooi geen uitzonderingen uit CanConvertTo.

De TypeConverterAttribute toepassen

Als u het conversieprogramma voor aangepaste typen wilt gebruiken als het acterende typeconversieprogramma voor een aangepaste klasse van .NET XAML Services, moet u de TypeConverterAttribute toepassen op uw klassedefinitie. De ConverterTypeName die u via het kenmerk opgeeft, moet de typenaam van het conversieprogramma voor aangepaste typen zijn. Als u dit kenmerk toepast wanneer een XAML-processor waarden verwerkt waarbij het eigenschapstype gebruikmaakt van uw aangepaste klassetype, kan het tekenreeksen invoeren en objectexemplaren retourneren.

U kunt ook per eigenschap een typeconversieprogramma opgeven. In plaats van een TypeConverterAttribute toe te passen op de klassedefinitie, past u deze toe op een eigenschapsdefinitie (de hoofddefinitie, niet de get/set implementaties erin). Het type van de eigenschap moet overeenkomen met het type dat wordt verwerkt door het conversieprogramma voor aangepaste typen. Wanneer met dit kenmerk wordt toegepast, kan een XAML-processor waarden van die eigenschap verwerken, invoerreeksen verwerken en objectexemplaren retourneren. De methode voor conversie per eigenschap is handig als u een eigenschapstype uit Microsoft .NET Framework of vanuit een andere bibliotheek wilt gebruiken waarin u de klassedefinitie niet kunt beheren en daar geen TypeConverterAttribute kunt toepassen.

Als u een typeconversiegedrag wilt opgeven voor een aangepast gekoppeld lid, past u TypeConverterAttribute toe op de Get accessormethode van het implementatiepatroon voor het gekoppelde lid.

Toegang tot serviceprovidercontext vanuit een implementatie van een markeringsextensie

De beschikbare services zijn hetzelfde voor een waardeconversieprogramma. Het verschil is hoe elke waardeconversieprogramma de servicecontext ontvangt. Toegang tot services en de beschikbare services worden beschreven in het onderwerp Type Conversieprogramma's en Markeringsextensies voor XAML-.

Typeconverters in de XAML-knooppuntstroom

Als u met een XAML-knooppuntstroom werkt, wordt de actie of het eindresultaat van een typeconversieprogramma nog niet uitgevoerd. In een laadpad blijft de kenmerkattribuutreeks die uiteindelijk moet worden omgezet om te laden, als een tekstwaarde binnen een startlid en een eindlid. Het typeconversieprogramma dat uiteindelijk nodig is voor deze bewerking, kan worden bepaald met behulp van de eigenschap XamlMember.TypeConverter. Het verkrijgen van een geldige waarde van XamlMember.TypeConverter is echter afhankelijk van een XAML-schemacontext, die toegang heeft tot dergelijke informatie via het onderliggende lid of het type objectwaarde dat het lid gebruikt. Voor het aanroepen van het typeconversiegedrag is ook de XAML-schemacontext vereist, omdat hiervoor typetoewijzing is vereist en een conversie-exemplaar moet worden gemaakt.

Zie ook