Übersicht über Typkonverter für XAML
Typkonverter stellen die Logik für einen Objekt-Writer bereit, der die Konvertierung von einer Zeichenfolge im XAML-Markup in bestimmte Objekte in einem Objektdiagramm vornimmt. In .NET-XAML-Diensten muss der Typkonverter eine Klasse sein, die aus TypeConverter abgeleitet wird. Einige Konverter unterstützen zudem den XAML-Speicherpfad und können zum Serialisieren eines Objekts in ein Zeichenfolgenformular im Serialisierungsmarkup verwendet werden. In diesem Thema wird beschrieben, wie und wann Typkonverter in XAML aufgerufen werden. Zudem enthält es Implementierungsratschläge für die Methodenüberschreibungen von TypeConverter.
Typkonvertierungskonzepte
Im folgenden Abschnitt werden die grundlegenden Konzepte dahingehend erläutert, wie XAML Zeichenfolgen verwendet und inwiefern Objekt-Writer in .NET-XAML-Diensten Typkonverter verwenden, um einige der Zeichenfolgenwerte zu verarbeiten, die in einer XAML-Quelle ermittelt werden.
XAML- und Zeichenfolgenwerte
Wenn Sie eine Attributwert in einer XAML-Datei festlegen, handelt es sich beim anfänglichen Typ dieses Werts um eine Zeichenfolge in einem allgemeinen Sinn und um einen Zeichenfolgenattributwert in einem XML-Sinn. Auch andere Primitive wie Double sind anfängliche Zeichenfolgen für einen XAML-Prozessor.
In den meisten Fällen benötigt ein XAML-Prozessor zwei Angaben, um einen Attributwert zu verarbeiten. Die erste Angabe ist der Werttyp der Eigenschaft, die festgelegt wird. Jede Zeichenfolge, die einen Attributwert definiert, und in XAML verarbeitet wird, muss schließlich umgewandelt werden oder zu einem Wert dieses Typs aufgelöst werden. Wenn es sich beim Wert um einen Primitiv handelt, den der XAML-Parser versteht (beispielsweise ein numerischer Wert), wird versucht, eine direkte Konvertierung der Zeichenfolge vorzunehmen. Wenn der Wert für das Attribut eine Aufzählung referenziert, wird der Name der angegebenen Zeichenfolge mit einer benannten Konstante in dieser Aufzählung abgeglichen. Wenn es sich beim Wert weder um ein Primitiv handelt, den der Parser versteht, noch um einen Konstantennamen aus einer Aufzählung, muss der zutreffende Typ einen Wert oder Verweis bereitstellen können, der auf einer konvertierten Zeichenfolge beruht.
Hinweis
XAML-Sprachdirektiven verwenden keine Typkonverter.
Typkonverter und Markuperweiterungen
Markuperweiterungen müssen durch einen XAML-Prozessor verarbeitet werden, bevor die Überprüfung auf Eigenschaftstyp und andere Überlegungen erfolgt. Wenn beispielsweise eine als Attribut festzulegende Eigenschaft normalerweise eine Typkonvertierung aufweist, in einem bestimmten Fall jedoch durch eine Markuperweiterungsverwendung festgelegt wird, dann wird das Markuperweiterungsverhalten zuerst festgelegt. Eine allgemeine Situation, in der eine Markuperweiterung erforderlich ist, besteht im Erstellen eines Verweises auf ein vorhandenes Objekt. In diesem Szenario kann ein zustandsloser Typkonverter nur eine neue Instanz genieren, die möglicherweise nicht gewünscht ist. Weitere Informationen zur Markuperweiterungen finden Sie unter Markup Extensions for XAML Overview.
Systemeigene Typkonverter
In den Implementierungen von Windows Presentation Foundation (WPF) und .NET-XAML-Diensten gibt es bestimmte CLR-Typen, die über eine native Typkonvertierungsverarbeitung verfügen. Diese CLR-Typen werden jedoch herkömmlich nicht als Primitive angesehen. Ein Beispiel eines solchen Typs ist DateTime. Ein Grund dafür besteht in der Funktionsweise der .NET Framework-Architektur: Der Typ DateTime ist in „mscorlib“ definiert. Hierbei handelt es sich um die grundlegendste Bibliothek in .NET. Es ist nicht zulässig, DateTime mit einem Attribut zu versehen, das aus einer anderen Assembly stammt, wodurch eine Abhängigkeit geschaffen wird (TypeConverterAttribute stammt aus dem System). Daher kann der gewöhnliche Typkonverter-Ermittlungsmechanismus durch die Attributierung nicht unterstützt werden. Stattdessen verfügt der XAML-Parser über eine Liste von Typen, für die die systemeigene Verarbeitung erforderlich ist, und diese Typen werden ähnlich wie echte Primitive verarbeitet. Im Fall von DateTimeumfasst diese Verarbeitung einen Aufruf von Parse.
Implementieren eines Typkonverters
In den folgenden Abschnitten wird die API der TypeConverter -Klasse erläutert.
TypeConverter
Unter .NET-XAML-Diensten sind alle Typkonverter, die für XAML-Zwecke verwendet werden, Klassen, die von der Basisklasse TypeConverter abgeleitet werden. Die Klasse TypeConverter war in Versionen von .NET Framework vorhanden, als es XAML noch nicht gab. Eins der ursprünglichen TypeConverter -Szenarien bestand darin, die Zeichenfolgenkonvertierung für Eigenschafts-Editoren in visuellen Designern bereitzustellen.
Für XAML wird die Rolle von TypeConverter erweitert. Für XAML-Zwecke ist TypeConverter die Basisklasse für das Bereitstellen von Unterstützung für bestimmte To- und From-Zeichenfolgekonvertierungen. Die From-Zeichenfolge ermöglicht das Analysieren eines Zeichenfolgenattributwerts aus XAML. Die To-Zeichenfolge ermöglicht das erneute Verarbeiten eines Laufzeitwerts einer bestimmten Objekteigenschaft zurück in ein Attribut in XAML für die Serialisierung.
TypeConverter definiert vier Member, die für die Konvertierungen von to- und from-Zeichenfolgen für XAML-Verarbeitungszwecke relevant sind:
Unter diesen Member lautet die wichtigste Methode ConvertFrom. Diese wandelt die Eingabezeichenfolge in den erforderlichen Objekttyp um. Die ConvertFrom -Methode kann implementiert werden, um einen größeren Typbereich in den gewünschten Zieltyp des Konverters zu konvertieren. Daher kann sie Zwecke erfüllen, die über XAML hinausgehen wie das Unterstützen von Laufzeitkonvertierungen. Für die XAML-Verwendung ist jedoch nur der Codepfad wichtig, der eine String -Eingabe verarbeiten kann.
Die zweitwichtigste Methode ist ConvertTo. Wenn eine Anwendung in eine Markupdarstellung umgewandelt wird (beispielsweise beim Speichern in XAML als Datei), wird ConvertTo im größeren Szenario eines XAML-TextWriter einbezogen, um eine Markupdarstellung zu erstellen. In diesem Fall besteht der wichtige Codepfad für XAML darin, wenn der Aufrufer einen destinationType
von Stringweitergibt.
CanConvertTo und CanConvertFrom sind Unterstützungsmethoden, die verwendet werden, wenn ein Dienst die Funktionen der TypeConverter -Implementierung abfragt. Sie müssen diese Methoden implementieren, um true
für typspezifische Klassen zurückzugeben, welche die entsprechenden Konvertierungsmethoden Ihres Konverters unterstützen. Für XAML-Zwecke bedeutet dies in der Regel den String -Typ.
Kulturinformations- und Typkonverter für XAML
Jede TypeConverter -Implementierung kann eindeutig interpretieren, was eine gültige Zeichenfolge für eine Konvertierung ist, und sie kann zudem die Typbeschreibung, die als Parameter weitergegeben wird, verwenden oder ignorieren. Eine wichtige Überlegung in Bezug auf die Kultur- und XAML-Typkonvertierung lautet wie folgt: Auch wenn die Verwendung von lokalisierbaren Zeichenfolgen als Attributwerten durch XAML unterstützt wird, können Sie diese lokalisierbaren Zeichenfolgen nicht als Typkonvertereingabe mit bestimmten Kulturanforderungen verwenden. Diese Einschränkung besteht, da Typkonverter für XAML-Attributwerte ein zwangsläufig festes XAML-Sprachverarbeitungsverhalten umfassen, in dem die en-US
-Kultur verwendet wird. Weitere Informationen zu den Entwicklungsgründen für diese Beschränkung finden Sie in der XAML-Sprachspezifikation ([MS-XAML]) oder unter Übersicht über WPF-Globalisierung und -Lokalisierung.
Beispielsweise können Kulturunterschiede in Kulturen ein Problem werden, in welchen anstelle eines Punkts als dezimales Trennzeichen ein Komma für die Zahlen im Zeichenfolgenformat verwendet wird. Diese Verwendung führt zu einem Konflikt mit dem Verhalten, das viele vorhandenen Typkonverter aufweisen, was in der Verwendung eines Kommas als Trennzeichen besteht. Das Weitergeben einer Kultur über xml:lang
in der umgebenden XAML löst das Problem nicht.
Implementieren von ConvertFrom
Damit die TypeConverter -Methode für diesen Konverter als eine ConvertFrom -Implementierung verwendet werden kann, die XAML unterstützt, muss sie eine Zeichenfolge als den value
-Parameter akzeptieren. Wenn die Zeichenfolge ein gültiges Format aufweist und durch die TypeConverter -Implementierung konvertiert werden kann, muss das zurückgegebene Objekt eine Umwandlung zum Typ unterstützen, der durch die Eigenschaft erwartet wird. Andernfalls muss die ConvertFrom -Implementierung null
zurückgeben.
Jede TypeConverter -Implementierung kann eindeutig interpretieren, was eine gültige Zeichenfolge für eine Konvertierung ausmacht, und sie kann zudem die Typbeschreibung oder Kulturkontexte verwenden oder ignorieren, die als Parameter weitergegeben werden. Bei der WPF-XAML-Verarbeitung werden jedoch möglicherweise nicht in allen Fällen Werte an den Typbeschreibungskontext weitergegeben, und wird möglicherweise zudem nicht die Kultur auf Grundlage von xml:lang
weitergegeben.
Hinweis
Verwenden Sie keine geschweiften Klammern ({}), und zwar insbesondere nicht die öffnende geschweifte Klammer ({) als Element Ihres Zeichenfolgenformats. Diese Zeichen sind als ein Eintrag reserviert und dienen dem Beenden einer Markuperweiterungssequenz.
Es ist angemessen, eine Ausnahme auszulösen, wenn Ihr Typkonverter über Zugriff auf einen XAML-Dienst vom Objekt-Writer der .NET-XAML-Dienste verfügen muss, der GetService-Aufruf, der für den Kontext ausgeführt wird, jedoch keinen Kontext für diesen Dienst zurückgibt.
Implementieren von ConvertTo
ConvertTo wird möglicherweise für die Serialisierungsunterstützung verwendet. Die Serialisierungsunterstützung durch ConvertTo für Ihren benutzerdefinierten Typ und dessen Typkonverter ist nicht unbedingt erforderlich. Wenn Sie jedoch ein Steuerelement implementieren oder die Serialisierung als Bestandteil der Features oder zum Entwerfen Ihrer Klasse verwenden, sollten Sie ConvertToimplementieren.
Damit die Verwendung als eine TypeConverter -Implementierung erfolgen kann, die XAML unterstützt, muss die ConvertTo -Methode für diesen Konverter eine Instanz des Typs (oder eines Werts) akzeptieren, die als der value
-Parameter unterstützt wird. Wenn der Parameter destinationType
vom Typ Stringist, muss das zurückgegebene Objekt in der Lage sein, als Stringumgewandelt zu werden. Die zurückgegebene Zeichenfolge muss einen serialisierten Wert von value
darstellen. Im Idealfall sollte das von Ihnen ausgewählte Serialisierungsformat in der Lage sein, den gleichen Wert zu generieren, als wenn die Zeichenfolge an die ConvertFrom -Implementierung desselben Konverters weitergegeben werden würde, und zwar ohne erhebliche Informationsverluste.
Wenn der Wert weder serialisiert werden kann noch der Konverter die Serialisierung unterstützt, muss die ConvertTo -Implementierung null
zurückgeben und kann eine Ausnahme auslösen. Wenn Sie jedoch Ausnahmen auslösen, sollten Sie die Unfähigkeit in Bezug auf die Verwendung dieser Konvertierung als Bestandteil Ihrer CanConvertTo -Implementierung melden, sodass die bewährte Vorgehensweise in Bezug auf die Überprüfung mit CanConvertTo zunächst darin besteht, dass die Vermeidung von Ausnahmen unterstützt wird.
Wenn der Parameter destinationType
nicht vom Typ Stringist, können Sie Ihre eigene Konverterverarbeitung auswählen. Für gewöhnlich nehmen Sie eine Zurücksetzung auf die grundlegende Implementierungsverarbeitung vor, wodurch in der Basis ConvertTo eine bestimmte Ausnahme ausgelöst wird.
Es ist angemessen, eine Ausnahme auszulösen, wenn Ihr Typkonverter über Zugriff auf einen XAML-Dienst vom Objekt-Writer der .NET-XAML-Dienste verfügen muss, der GetService-Aufruf, der für den Kontext ausgeführt wird, jedoch keinen Kontext für diesen Dienst zurückgibt.
Implementieren von CanConvertFrom
Ihre Implementierung CanConvertFrom sollte true
für sourceType
vom Typ String zurückgeben und andernfalls die grundlegende Implementierung ableiten. Lösen Sie keine Ausnahmen aus CanConvertFrom aus.
Implementieren von CanConvertTo
Ihre Implementierung CanConvertTo sollte true
für destinationType
vom Typ Stringzurückgeben und andernfalls die grundlegende Implementierung ableiten. Lösen Sie keine Ausnahmen aus CanConvertTo aus.
Anwenden von TypeConverterAttribute
Damit Ihr benutzerdefinierter Typkonverter als der agierende Typkonverter für eine benutzerdefinierte Klasse durch .NET-XAML-Dienste verwendet wird, müssen Sie TypeConverterAttribute auf Ihre Klassendefinition anwenden. Beim ConverterTypeName , den Sie über das Attribut angeben, muss es sich um den Typnamen Ihres benutzerdefinierten Typkonverters handeln. Beim Anwenden dieses Attributs, wenn ein XAML-Prozessor Werte verarbeitet, bei denen der Eigenschaftstyp Ihren benutzerdefinierten Klassentyp verwendet, kann es Zeichenfolgen eingeben und Objektinstanzen zurückgeben.
Sie können auch einen Typkonverter auf Grundlage einzelner Eigenschaften bereitstellen. Anstelle ein TypeConverterAttribute-Element auf die Klassendefinition anzuwenden, wenden Sie es auf eine Eigenschaftsdefinition (die Hauptdefinition, nicht die darin enthaltenen get
/set
-Implementierungen) an. Der Eigenschaftstyp muss mit dem Typ übereinstimmen, der durch Ihren benutzerdefinierten Typkonverter verarbeitet wird. Wenn dieses Attribut angewendet ist, wenn ein XAML-Prozessor Werte dieser Eigenschaft verarbeitet, kann es Eingabezeichenfolgen verarbeiten und Objektinstanzen zurückgeben. Die Typkonvertertechnik auf Grundlage einzelner Eigenschaften ist nützlich, wenn Sie einen Eigenschaftstyp aus Microsoft .NET Framework oder einer anderen Bibliothek verwenden möchten, wo Sie die Klassendefinition weder steuern noch dort ein TypeConverterAttribute-Element anwenden können.
Wenden Sie zum Bereitstellen eines Typkonvertierungsverhaltens für ein benutzerdefiniertes angefügtes Member TypeConverterAttribute auf die Get
-Accessor-Methode des Implementierungsmusters für das angefügte Member an.
Zugriff auf den Dienstanbieterkontext über eine Markuperweiterungsimplementierung
Die verfügbaren Dienste sind für jeden Wertkonverter gleich. Der Unterschied besteht darin, wie jeder Wertkonverter den Dienstkontext empfängt. Der Zugriff auf Dienste und die verfügbaren Dienste wird im Thema Type Converters and Markup Extensions for XAMLbeschrieben.
Typkonverter im XAML-Knotenstream
Beim Verwenden eines XAML-Knotenstreams wurde weder die Aktion noch das Endergebnis eines Typkonverters bis dato ausgeführt. In einem Ladepfad muss die Attributzeichenfolge schließlich typkonvertiert werden, um Reste als ein Textwert im Start- und End-Member zu laden. Der schließlich für diesen Vorgang benötigte Typkonverter kann anhand der Eigenschaft XamlMember.TypeConverter ermittelt werden. Das Abrufen eines gültigen Werts von XamlMember.TypeConverter verlangt jedoch, über einen XAML-Schemakontext zu verfügen, worüber auf diese Informationen über das zugrunde liegende Member oder den Typ des Objektwerts, den das Member verwendet, zugegriffen werden kann. Für das Aufrufen des Typkonvertierungsverhaltens ist zudem der XAML-Schemakontext erforderlich, da dafür die Typzuordnung und das Erstellen einer Konverterinstanz erforderlich sind.
Weitere Informationen
.NET Desktop feedback