Freigeben über


Typkonverter und Markuperweiterungen für XAML

Typkonverter und Markuperweiterungen sind zwei Techniken, die XAML-Typsysteme und XAML-Autoren zum Generieren von Objektdiagrammkomponenten verwenden. Obwohl sie einige Merkmale gemeinsam nutzen, werden Typkonverter und Markuperweiterungen in einem XAML-Knotenstream unterschiedlich dargestellt. In diesem Dokumentationssatz werden Typkonverter, Markuperweiterungen und ähnliche Konstrukte manchmal als Wertkonverter bezeichnet.

Wertkonverter

In XAML werden Wertkonverter für verschiedene Szenarien verwendet. Die folgende Liste zeigt die verschiedenen Typen von Wertkonvertern in XAML:

  • Typkonverter

  • Markuperweiterung

  • Wert serialisierer

  • Verwandte Klasse oder Unterstützungsklasse, die die Logik für eine XAML-Textsyntax bereitstellt

Typkonverter

In .NET XAML Services-Definition sind Typkonverter Klassen, die von der CLR-TypeConverter-Klasse abgeleitet sind. TypeConverter ist eine Klasse, die sich in .NET befand, bevor XAML vorhanden war. Der ursprüngliche Zweck bestand darin, Eigenschaftenfenster und ähnliche textbasierte Bearbeitungsmetaphern für IDE-Eigenschaften zu unterstützen. Die Einführung von XAML in .NET verwendet TypeConverter, um eine Textsyntax (wie in einem Attributwert oder einem XAML-Wertknoten zu finden) in ein Objekt zu konvertieren. TypeConverter können auch verwendet werden, um einen Objektwert in die Textsyntax zu serialisieren. TypeConverter wurde auch in früheren frameworkspezifischen XAML-Implementierungen in Windows Presentation Foundation (WPF) und Windows Communication Foundation (WCF) verwendet. Weitere Informationen zum TypeConverter in XAML finden Sie unter Type Converters for XAML Overview.

Markuperweiterungen

In der .NET XAML Services-Implementierung sind Markuperweiterungen Klassen, die von der MarkupExtension Klasse abgeleitet sind. Markuperweiterungen sind ein Konzept, das in dieser Form von der XAML-Sprache stammt. Sie können sich eine Markuperweiterung wie eine erweiterbare Escapesequenz vorstellen, die in eine Dienstklasse aufruft, um ihre Logik bereitzustellen. Im Hinblick auf Markup erkennen XAML-Prozessoren eine Markuperweiterung universell durch eine Textsequenz, die mit einer öffnenden geschweiften Klammer ({) in einer Textzeichenfolge beginnt.

Markuperweiterungen unterscheiden sich von Typkonvertern. Typkonverter sind in der Regel Typen oder Membern zugeordnet. Sie werden aufgerufen, wenn eine Objektdiagrammerstellung oder eine Serialisierung auf eine Textsyntax stößt, die diesen Entitäten zugeordnet ist.

Markuperweiterungen sind einer einzelnen unterstützenden Dienstklasse zugeordnet, können jedoch für jeden Memberwert angewendet werden. (Sie können Ihre Markuperweiterung jedoch implementieren, um die Verwendung absichtlich auf bestimmte Member oder Zieltypen zu beschränken, indem Sie den Dienstkontext verwenden.) Markuperweiterungen können eine Typkonverterzuordnung überschreiben. Sie können sie auch verwenden, um einen Attributwert für Elemente anzugeben, die andernfalls keine Textsyntax unterstützen würden.

Weitere Informationen zum Implementierungsmuster für Markuperweiterungen für XAML finden Sie unter Markuperweiterungen für XAML –Übersicht.

Wert serialisierer

Ein ValueSerializer ist ein spezieller Typkonverter, der für die Konvertierung eines Objekts in eine Zeichenfolge optimiert ist. Eine ValueSerializer für XAML implementiert möglicherweise die ConvertFrom Methode überhaupt nicht. Eine ValueSerializer Implementierung ruft Dienste auf eine Weise ab, die wie eine TypeConverter Implementierung ist. Die virtuellen Methoden stellen einen Eingabeparameter context bereit. Der context-Parameter ist vom Typ IValueSerializerContext, der von der IServiceProvider Schnittstelle erbt und über eine GetService-Methode verfügt.

Im XAML-Typsystem und für XAML-Writer-Implementierungen, die die XAML-Knotenschleifenverarbeitung für die Serialisierung verwenden, wird ein Wertkonverter, der einem Typ oder Element zugeordnet ist, von einer eigenen XamlType.ValueSerializer-Eigenschaft gemeldet. Die Bedeutung für XAML-Autoren, die Serialisierung ausführen, ist, dass, wenn ein XamlType.TypeConverter und XamlType.ValueSerializer vorhanden sind, der Typkonverter für den Ladepfad verwendet werden sollte, und der Wert serialisierer sollte für den Speicherpfad verwendet werden. Wenn XamlType.TypeConverter vorhanden ist, XamlType.ValueSerializer jedoch nullist, wird der Typkonverter auch für den Speicherpfad verwendet.

Andere Wertkonverter

Ein Wertkonverter ist über die spezifischen Muster eines Typkonverters oder einer Markuperweiterung hinaus erweiterbar. Diese Anpassung erfordert jedoch auch die Neudefinition des XAML-Typsystems, wie es von .NET XAML Services bereitgestellt wird. Das vorhandene XAML-Typsystem verfügt über Darstellungen und Berichtssysteme für Typkonverter, Markuperweiterungen und Wert serialisierer, jedoch nicht für benutzerdefinierte Formen der Wertkonvertierung. Wenn Sie benutzerdefinierte Wertkonverter erstellen möchten, verwenden Sie den XamlValueConverter<TConverterBase> Typ.

Typkonverter und Markuperweiterungen in Kombination

Markuperweiterungen und Typkonverter werden für verschiedene Situationen in XAML verwendet. Obwohl der Kontext für die Verwendung von Markuperweiterungen verfügbar ist, wird das Typkonvertierungsverhalten von Eigenschaften, bei denen eine Markuperweiterung einen Wert bereitstellt, in der Regel nicht in den Markuperweiterungsimplementierungen überprüft. Anders ausgedrückt: Selbst wenn eine Markuperweiterung eine Textzeichenfolge als ProvideValue Ausgabe zurückgibt, wird das Typkonvertierungsverhalten für diese Zeichenfolge, wie auf eine bestimmte Eigenschaft oder einen Eigenschaftswerttyp angewendet, nicht aufgerufen. Im Allgemeinen besteht der Zweck einer Markuperweiterung darin, eine Zeichenfolge zu verarbeiten und ein Objekt ohne Typkonverter zurückzugeben.

Dienstkontext für einen Wertkonverter

Wenn Sie einen Wertkonverter implementieren, benötigen Sie häufig Zugriff auf einen Kontext, in dem der Wertkonverter angewendet wird. Dieser Kontext wird als Dienstkontext bezeichnet. Der Dienstkontext kann Informationen wie den aktiven XAML-Schemakontext, den Zugriff auf das Typzuordnungssystem enthalten, das der XAML-Schemakontext und der XAML-Objektschreiber bereitstellen usw. Weitere Informationen zu den für einen Wertkonverter verfügbaren Dienstkontexten und zum Zugreifen auf die Dienste, die ein Dienstkontext bereitstellen kann, finden Sie unter Dienstkontexte, die für Typkonverter und Markuperweiterungenverfügbar sind.

Siehe auch