Typkonverter und Markuperweiterungen für XAML

Typkonverter und Markuperweiterung sind zwei Techniken, mit denen XAML-Typsysteme und XAML-Writer Objektdiagrammkomponenten generieren. Obwohl sie einige gemeinsame Eigenschaften aufweisen, werden Typkonverter und Markuperweiterungen in einem XAML-Knotenstream unterschiedlich dargestellt. In dieser Dokumentation werden Typkonverter, Markuperweiterungen und ähnliche Konstrukte manchmal zusammenfassend als Wertkonverter bezeichnet.

Wertkonverter

In XAML werden Wertkonverter für verschiedene Szenarien verwendet. Die folgende Liste enthält die verschiedenen Arten von Wertkonvertern im XAML:

  • Typkonverter

  • Markuperweiterung

  • Werte-Serialisierungsprogramm

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

Typkonverter

In der .NET XAML Services-Definition sind Typkonverter von der CLR-Klasse TypeConverter abgeleitete Klassen. TypeConverter ist eine Klasse, die es in .NET gab, bevor XAML verfügbar war. Der ursprüngliche Zweck war, Eigenschaftenfenster und ähnliche textbasierte Bearbeitungsmetaphern für IDE-Eigenschaften zu unterstützen. Die Einführung von XAML in .NET verwendet TypeConverter zum Konvertieren einer Textsyntax (wie sie in einem Attributwert oder XAML-Wertknoten zu finden ist) in ein Objekt. TypeConverter kann auch zum Serialisieren eines Objektwerts in Textsyntax verwendet werden. TypeConverter wurde auch in früheren frameworkspezifischen XAML-Implementierungen in WPF (Windows Presentation Foundation) und WCF (Windows Communication Foundation) verwendet. Weitere Informationen zum TypeConverter in XAML finden Sie unter Type Converters for XAML Overviewverwendet.

Markuperweiterungen

In der Implementierung der .NET XAML Services sind Markuperweiterungen von der MarkupExtension-Klasse abgeleitete Klassen. Markuperweiterungen sind ein Konzept, das in dieser Form aus der XAML-Sprache entstanden ist. Stellen Sie sich eine Markuperweiterung in etwa als eine erweiterbare Escapesequenz vor, die eine Dienstklasse aufruft, um ihre Logik bereitzustellen. Im Hinblick auf Markup erkennen XAML-Prozessoren universell eine Markuperweiterung anhand einer Textsequenz, die mit einer öffnenden geschweiften Klammer ({) in einer Textzeichenfolge beginnt.

Markuperweiterungen unterscheiden sich von Typkonvertern. Typkonverter sind normalerweise Typen oder Membern zugeordnet. Sie werden aufgerufen, wenn bei der Erstellung eines Objektdiagramms oder einer Serialisierung eine Textsyntax gefunden wird, die solchen Entitäten zugeordnet ist.

Markuperweiterungen sind einer einzelnen unterstützenden Dienstklasse zugeordnet, können aber für jeden Memberwert angewendet werden. (Allerdings können Sie die Markuperweiterung so implementieren, dass ihre Verwendung mithilfe von Dienstkontext bewusst auf bestimmte Member oder Zieltypen eingeschränkt wird.) Markuperweiterungen können die Zuordnung eines Typkonverters überschreiben. Oder Sie können sie verwenden, um einen Attributwert für Member anzugeben, die eine Textsyntax andernfalls nicht unterstützen würden.

Weitere Informationen zu den Implementierungsmustern für Markuperweiterungen für XAML finden Sie unter Markup Extensions for XAML Overview.

Werte-Serialisierungsprogramme

Ein ValueSerializer ist ein spezialisierter Typkonverter, der zum Konvertieren eines Objekts in eine Zeichenfolge optimiert ist. Ein ValueSerializer für XAML implementiert die ConvertFrom -Methode möglicherweise überhaupt nicht. Eine ValueSerializer -Implementierung ruft Dienste auf eine Weise auf, die einer TypeConverter -Implementierung gleicht. Die virtuellen Methoden bieten einen Eingabe- context -Parameter. 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 Verarbeitung von XAML-Knotenschleifen für die Serialisierung verwenden, wird ein Wertkonverter, der einem Typ oder Member zugeordnet ist, durch seine eigene XamlType.ValueSerializer -Eigenschaft gemeldet. Die Bedeutung für XAML-Writer, die Serialisierungen durchführen, ist, dass wenn ein XamlType.TypeConverter und XamlType.ValueSerializer vorhanden sind, der Typkonverter für den Pfad zum Laden verwendet werden sollte und das Werte-Serialisierungsprogramm für den Pfad zum Speichern. Wenn XamlType.TypeConverter vorhanden ist, aber XamlType.ValueSerializernullist, wird der Typkonverter auch für den Pfad zum Speichern verwendet.

Andere Wertkonverter

Ein Wertkonverter kann über die spezifischen Muster eines Typkonverters oder einer Markuperweiterungen hinaus erweitert werden. Diese Anpassung erfordert jedoch auch die Neudefinition des XAML-Typsystem entsprechend der Bereitstellung durch .NET XAML Services. Das vorhandene XAML-Typsystem verfügt über Darstellungen und Berichtssysteme für Typkonverter, Markuperweiterungen und Werte-Serialisierungsprogramme, jedoch nicht für benutzerdefinierte Formen der Wertkonvertierung. Wenn Sie benutzerdefinierte Wertkonverter erstellen möchten, verwenden Sie den XamlValueConverter<TConverterBase> -Typ.

Typkonverter und Markuperweiterungen kombiniert

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 Implementierungen der Markuperweiterung überprüft. Mit anderen Worten, auch wenn eine Markuperweiterung eine Textzeichenfolge als ProvideValue -Ausgabe zurückgibt, wird das Typkonvertierungsverhalten für diese Zeichenfolge entsprechend der Anwendung auf eine spezifische Eigenschaft oder einen spezifischen Eigenschaftswerttyp nicht aufgerufen. Im Allgemeinen besteht der Zweck einer Markuperweiterung darin, eine Zeichenfolge zu verarbeiten und ein Objekt ohne Beteiligung eines Typkonverters 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, Zugriff auf das vom XAML-Schemakontext und XAML-Objektwriter bereitgestellte Typenzuordnungssystem usw. enthalten. Weitere Informationen zu den für einen Wertkonverter verfügbaren Dienstkontexten sowie dazu, wie auf die Dienste zugegriffen wird, die ein Dienstkontext bereitstellen kann, finden Sie unter Service Contexts Available to Type Converters and Markup Extensions.

Weitere Informationen