Freigeben über


Typkonverter und Markuperweiterungen für XAML

Typkonverter und Markuperweiterungen sind zwei Techniken, mit denen XAML-Typsysteme und XAML-Writer Komponenten von Objektdiagrammen 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.

Dieses Thema enthält folgende Abschnitte.

  • Wertkonverter
  • Typkonverter
  • Markuperweiterungen
  • Wertserialisierungsprogramme
  • Andere Wertkonverter
  • Typkonverter und Markuperweiterungen in Kombination
  • Dienstkontext für einen Wertkonverter
  • Verwandte Abschnitte

Wertkonverter

In XAML werden Wertkonverter für verschiedene Szenarien verwendet. In der folgenden Liste sind die verschiedenen Wertkonvertertypen in XAML aufgeführt:

  • Typkonverter

  • Markuperweiterung

  • Wertserialisierungsprogramm

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

Typkonverter

In der Definition der .NET Framework-XAML-Dienste sind Typkonverter von der TypeConverter-CLR-Klasse abgeleitete Klassen. TypeConverter ist eine Klasse, die in Microsoft .NET Framework vor XAML verfügbar war. Ihr Zweck bestand ursprünglich darin, Eigenschaftenfenster und ähnliche textbasierte Bearbeitungsmetaphern für IDE-Eigenschaften zu unterstützen. XAML in .NET Framework konvertiert, wie bei einem Attributwert oder einem XAML-Wertknoten, eine Textsyntax mithilfe von TypeConverter in ein Objekt. TypeConverter kann auch zum Serialisieren eines Objektwerts in Textsyntax verwendet werden. TypeConverter wurde auch in vorherigen frameworkspezifischen XAML-Implementierungen in Windows Presentation Foundation (WPF) und Windows Communication Foundation (WCF) verwendet. Weitere Informationen zum TypeConverter in XAML finden Sie unter Übersicht über Typkonverter für XAML.

Markuperweiterungen

In der Implementierung für .NET Framework-XAML-Dienste sind Markuperweiterungen Klassen, die sich von der MarkupExtension-CLR-Klasse ableiten. Markuperweiterungen sind ein Konzept, das in dieser Form aus der XAML-Sprache entstanden ist. Sie können sich eine Markuperweiterung in etwa als eine erweiterbare Escapesequenz vorstellen, die eine Dienstklasse aufruft, um ihre Logik bereitzustellen. XAML-Prozessoren erkennen eine Markuperweiterung immer an einer Textsequenz, die mit der öffnenden geschweiften Klammer ({) in einer Textzeichenfolge beginnt.

Markuperweiterungen unterscheiden sich von Typkonvertern. Typkonverter werden normalerweise Typen oder Membern zugeordnet. Sie werden aufgerufen, wenn beim Erstellen eines Objektdiagramms oder bei einer Serialisierung Textsyntax gefunden wird, die diesen Entitäten zugeordnet ist.

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

Weitere Informationen zum Markuperweiterungs-Implementierungsmuster für XAML finden Sie unter Übersicht über Markuperweiterungen für XAML.

HinweisHinweis

Die MarkupExtension- und ValueSerializer-Typen befinden sich beide im System.Windows.Markup-Namespace, nicht im System.Xaml-Namespace.Dies bedeutet nicht, dass diese Typen für die WPF- oder Windows Forms-Technologie spezifisch sind, die andernfalls CLR-Namespaces auffüllen, die die Zeichenfolge Windows enthalten.MarkupExtension und ValueSerializer sind Typen in der System.Xaml-Assembly und weisen keine bestimmte Frameworkabhängigkeit auf.Diese Typen waren in .NET Framework 3.0 im CLR-Namespace enthalten und verbleiben in .NET Framework 4 im CLR-Namespace, damit Verweise in vorhandenen WPF-Projekten nicht beschädigt werden.Weitere Informationen finden Sie unter Aus WPF zu System.Xaml migrierte Typen.

Wertserialisierungsprogramme

Ein ValueSerializer ist ein spezialisierter Typkonverter, der zum Konvertieren eines Objekts in eine Zeichenfolge optimiert wurde. Ein ValueSerializer für XAML implementiert die ConvertFrom-Methode möglicherweise überhaupt nicht. Eine ValueSerializer-Implementierung ruft Dienste auf ähnliche Weise ab wie eine TypeConverter-Implementierung. Die virtuellen Methoden stellen einen context-Eingabeparameter bereit. Der context-Parameter weist den IValueSerializerContext-Typ auf, der von der IServiceProvider-Schnittstelle erbt und eine GetService-Methode aufweist.

Im XAML-Typsystem und für XAML-Writerimplementierungen mit XAML-Knotenschleifenverarbeitung für die Serialisierung wird ein Wertkonverter, der einem Typ oder Member zugeordnet ist, von seiner eigenen XamlType.ValueSerializer-Eigenschaft gemeldet. Für XAML-Writer, die eine Serialisierung ausführen, bedeutet dies, dass der Typkonverter für den Ladepfad und das Wertserialisierungsprogramm für den Speicherungspfad verwendet werden sollten, sofern ein XamlType.TypeConverter und ein XamlType.ValueSerializer vorhanden sind. Wenn ein XamlType.TypeConverter vorhanden ist, XamlType.ValueSerializer aber null ist, wird der Typkonverter auch für den Speicherpfad verwendet.

Andere Wertkonverter

Ein Wertkonverter kann über die spezifischen Muster von Typkonvertern oder Markuperweiterungen hinaus erweitert werden. Diese Anpassung würde jedoch auch die erneute Definition des von den .NET Framework-XAML-Diensten bereitgestellten XAML-Typsystems erfordern. Das vorhandene XAML-Typsystem verfügt über Darstellungen und Berichtssysteme für Typkonverter, Markuperweiterungen und Wertserialisierungsprogramme, jedoch nicht für benutzerdefinierte Masken der Wertkonvertierung. Wenn Sie benutzerdefinierte Wertkonverter erstellen möchten, verwenden Sie den XamlValueConverter<TConverterBase>-Typ.

Typkonverter und Markuperweiterungen in Kombination

Markuperweiterungen und Typkonverter werden in XAML für unterschiedliche Situationen verwendet. Obwohl für Markuperweiterungen Kontext verfügbar ist, wird das Typkonvertierungsverhalten von Eigenschaften, bei denen eine Markuperweiterung einen Wert bereitstellt, im Allgemeinen nicht in den Markuperweiterungsimplementierungen überprüft. Anders ausgedrückt heißt das: Auch wenn eine Markuperweiterung eine Textzeichenfolge als ProvideValue zurückgibt, wird das Typkonvertierungsverhalten nicht wie bei einer speziellen Eigenschaft oder einem Eigenschaftswerttyp für diese Zeichenfolge aufgerufen. Im Allgemeinen ist der Zweck einer Markuperweiterung, eine Zeichenfolge zu verarbeiten und ein Objekt ohne Typkonverter zurückzugeben.

Dienstkontext für einen Wertkonverter

Bei der Implementierung eines Wertkonverters benötigen Sie häufig Zugriff auf den Kontext, in dem der Wertkonverter angewendet wird. Dieser Kontext wird als Dienstkontext bezeichnet. Der Dienstkontext könnte Informationen, wie z. B. den aktiven XAML-Schemakontext, Zugriff auf das vom XAML-Schemakontext und dem XAML-Objektwriter bereitgestellte Typzuordnungssystem usw., enthalten. Weitere Informationen zu den für Wertkonverter verfügbaren Dienstkontexten und dazu, wie auf von einem Dienstkontext bereitgestellte Dienste zugegriffen werden kann, finden Sie unter Für Typkonverter und Markuperweiterungen verfügbare Dienstkontexte.

Siehe auch

Referenz

MarkupExtension

XamlObjectWriter

Weitere Ressourcen

Übersicht über Markuperweiterungen für XAML

Übersicht über Typkonverter für XAML

Für Typkonverter und Markuperweiterungen verfügbare Dienstkontexte