Freigeben über


TypeConverter und XAML

Aktualisiert: November 2007

Die TypeConverter-Klasse ist Teil der Implementierung für eine verwaltete benutzerdefinierte Klasse, die als Eigenschaftenwert in der Extensible Application Markup Language (XAML)-Attributverwendung verwendet werden kann. Wenn Sie eine benutzerdefinierte Klasse erstellen und möchten, dass Instanzen dieser Klasse als festlegbare Extensible Application Markup Language (XAML)-Attributwerte fungieren, müssen Sie unter Umständen ein TypeConverterAttribute auf die Klasse anwenden, eine benutzerdefinierte TypeConverter-Klasse erstellen oder beides.

Dieses Thema enthält folgende Abschnitte.

  • XAML und Zeichenfolgenwerte
  • Implementieren eines Typkonverters
  • Übernehmen des TypeConverterAttribute
  • Verwandte Abschnitte

XAML und Zeichenfolgenwerte

Wenn Sie in XAML einen Attributwert festgelegt haben, ist der ursprüngliche Typ dieses Werts String. Auch andere Primitives wie Double sind anfänglich Zeichenfolgen für einen XAML-Prozessor, obwohl die Umwandlung in andere primitive Werte, die keine Zeichenfolgen sind, oder die Umwandlung von benannten Werten einer Enumeration aufgrund der integrierten Typkonvertierungen relativ einfach ist.

Ein XAML-Prozessor benötigt zwei Informationen, um einen Attributwert zu verarbeiten. Die erste Information ist der Werttyp der Eigenschaft, die festgelegt wird. Jede Zeichenfolge, die einen Attributwert definiert und in XAML verarbeitet wird, muss schließlich in einen Wert dieses Typs umgewandelt oder aufgelöst werden. Wenn der Wert ein Primitive ist, wird eine direkte Umwandlung der Zeichenfolge versucht. Wenn der Wert eine Enumeration ist, wird die Zeichenfolge verwendet, um diese Enumeration auf eine Namensübereinstimmung zu überprüfen. Wenn es sich bei dem Wert weder um einen Primitive noch eine Enumeration handelt, muss der betreffende Typ in der Lage sein, eine Instanz des Typs oder einen Wert basierend auf einer konvertierten Zeichenfolge bereitzustellen.

Ein spezieller Fall ist eine Markuperweiterung. Die Verwendung von Markuperweiterungen muss durch einen XAML-Prozessor verarbeitet werden, bevor auf Eigenschaftentypen oder andere Aspekte geprüft wird. Im Allgemeinen besteht der Zweck einer Markuperweiterung in der Verarbeitung einer Zeichenfolge und der Rückgabe eines Objekts. Wenn das zurückgegebene Objekt eine Typübereinstimmung für die Eigenschaft ist, bietet die Markuperweiterung einen Wert für eine Eigenschaft in einer Art und Weise, mit der jede Typkonvertierung vermieden wird, die außerhalb des Implementierungscodes für die Markuperweiterung stattfindet. Eine typische Situation, in der eine Markuperweiterung nötig ist, ist der Verweis auf ein bereits vorhandenes Objekt (ein Typkonverter ohne Status kann höchstens eine neue Instanz generieren, was unter Umständen nicht wünschenswert ist). Weitere Informationen über Markuperweiterungen finden Sie unter Markuperweiterungen und XAML.

TypeConverter

Wenn der Wert nicht vom Typ Primitive oder Enumeration ist und keine Markuperweiterungsverwendung besteht, muss es eine Methode zum Umwandeln eines String in die geeignete Zeichenfolge oder eine neue Instanz geben, wenn XAML verarbeitet wird. Dies ist die Rolle der TypeConverter-Implementierung. TypeConverter definiert vier Member, die relevant für die Umwandlung von und in Zeichenfolgen für XAML-Verarbeitungszwecke sind:

Die wichtigste Methode ist ConvertFrom. Diese Methode wandelt die Eingabezeichenfolge in den erforderlichen Objekttyp um.

Die nächste wichtigste Methode ist ConvertTo. Wenn eine WPF-Anwendung in eine Markupdarstellung umgewandelt wird (wenn sie z. B. in XAML gespeichert wird), ist ConvertTo verantwortlich für die Erstellung einer Markupdarstellung.

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 für bestimmte Fälle true zurückzugeben, insbesondere für den String-Typ.

Implementieren eines Typkonverters

Implementieren von ConvertFrom

Um als TypeConverter-Implementierung verwendet werden zu können, die XAML unterstützt, muss die ConvertFrom-Methode für diesen Konverter eine Zeichenfolge als value-Parameter akzeptieren. Wenn die Zeichenfolge in einem gültigen Format vorliegt und von der TypeConverter-Implementierung umgewandelt werden kann, muss das zurückgegebene Objekt eine Umwandlung in den von der Eigenschaft erwarteten Typ unterstützen. Andernfalls muss die ConvertFrom-Implementierung null zurückgeben.

Jede TypeConverter-Implementierung kann ihre eigene Interpretation einer gültigen Zeichenfolge für eine Umwandlung haben und kann auch die Typbeschreibungs- oder Kulturkontexte, die als Parameter übergeben werden, verwenden oder ignorieren. Die WPF XAML-Verarbeitung übergibt jedoch unter Umständen nicht in allen Fällen Werte an den Typbeschreibungskontext und ebenfalls keine auf xml-lang basierende Kultur.

Tipp

Verwenden Sie die geschweifte Klammerzeichen nicht als Element des Zeichenfolgenformats, insbesondere nicht {,. Diese Zeichen sind für den Beginn und das Ende einer Markuperweiterungssequenz reserviert.

Implementieren von ConvertTo

ConvertTo wird möglicherweise für die Serialisierungsunterstützung verwendet. Die Serialisierungsunterstützung für Ihren benutzerdefinierten Typ ist keine absolute Anforderung. Wenn Sie jedoch ein Steuerelement implementieren oder eine Serialisierung als Teil der Features oder der Gestaltung Ihrer Klasse verwenden, sollten Sie ConvertTo implementieren.

Um als TypeConverter-Implementierung verwendet werden zu können, die XAML unterstützt, muss die ConvertTo-Methode für diesen Konverter eine Instanz des Typs (oder einen Wert) akzeptieren, der als value-Parameter unterstützt wird. Wenn der destinationType-Parameter vom Typ String ist, muss das zurückgegebene Objekt in String umwandelbar sein. Die zurückgegebene Zeichenfolge muss einen serialisierten Wert von value darstellen. Das von Ihnen gewählte Serialisierungsformat sollte ohne bedeutenden Informationsverlust ermöglichen, den gleichen Wert zu generieren, der generiert wird, wenn diese Zeichenfolge an die ConvertFrom-Implementierung desselben Konverters übergeben wird.

Wenn der Wert nicht serialisiert werden kann oder der Konverter die Serialisierung nicht unterstützt, muss die ConvertTo-Implementierung null zurückgeben und kann in diesem Fall eine Ausnahme ausgeben.

Wenn der destinationType-Parameter nicht vom Typ String ist, können Sie eine eigene Konverterbehandlung auswählen. In der Regel greifen Sie auf die Basisimplementierungsbehandlung zurück.

Jede TypeConverter-Implementierung kann ihre eigene Interpretation einer gültigen Zeichenfolge für eine Umwandlung haben und kann auch die Typbeschreibungs- oder Kulturkontexte, die als Parameter übergeben werden, verwenden oder ignorieren.

Tipp

Verwenden Sie die geschweiften Klammerzeichen nicht als Element des Zeichenfolgenformats, insbesondere nicht {,. Diese Zeichen sind für den Beginn und das Ende einer Markuperweiterungssequenz reserviert.

Implementieren von CanConvertTo

Ihre CanConvertTo-Implementierung sollte true für destinationType vom Typ String zurückgeben und andernfalls auf die Basisimplementierung zurückgreifen.

Implementieren von CanConvertFrom

Ihre CanConvertFrom-Implementierung sollte true für sourceType vom Typ String zurückgeben und andernfalls auf die Basisimplementierung zurückgreifen.

Übernehmen des TypeConverterAttribute

Damit der benutzerdefinierte Typkonverter als aktiver Typkonverter für eine benutzerdefinierte Klasse verwendet werden kann, müssen Sie das .NET Framework-Attribut TypeConverterAttribute auf Ihre Klassendefinition anwenden. Der ConverterTypeName, den Sie über das Attribut angeben, muss der Typname des benutzerdefinierten Typkonverters sein. Bei Anwendung dieses Attributs können Zeichenfolgen eingegeben und Objektinstanzen zurückgegeben werden, wenn ein XAML-Prozessor Werte verarbeitet, sofern der Eigenschaftentyp Ihren benutzerdefinierten Klassentyp verwendet.

Sie können auch einen Typkonverter auf Eigenschaftenbasis bereitstellen. Anstatt ein .NET Framework-Attribut TypeConverterAttribute auf die Klassendefinition anzuwenden, sollten Sie es auf eine Eigenschaftendefinition anwenden (die Hauptdefinition, nicht die darin enthaltenen get/set-Implementierungen). Der Typ der Eigenschaft muss dem Typ entsprechen, der von Ihrem benutzerdefinierten Typkonverter verarbeitet wird. Bei Anwendung dieses Attributs können Zeichenfolgen verarbeitet und Objektinstanzen zurückgegeben werden, wenn ein XAML-Prozessor Werte dieser Eigenschaft verarbeitet. Die Typkonvertertechnik auf Eigenschaftenbasis ist vor allem dann hilfreich, wenn Sie einen Eigenschaftentyp von Microsoft .NET Framework oder einer anderen Bibliothek verwenden, bei dem Sie die Klassendefinition nicht steuern können und kein TypeConverterAttribute anwenden können.

Siehe auch

Konzepte

Übersicht über XAML

Markuperweiterungen und XAML

Terminologie der XAML-Syntax

Referenz

TypeConverter