XAML の型コンバーターおよびマークアップ拡張機能

型コンバーターとマークアップ拡張機能は、XAML 型システムと XAML ライターが、オブジェクト グラフ コンポーネントを生成するために使用する 2 つの手法です。 型コンバーターとマークアップ拡張機能は、一部の特性を共有しますが、XAML ノード ストリームでは異なる方法で表現されます。 このドキュメント セットでは、型コンバーター、マークアップ拡張機能、およびこれに類似したコンストラクトを、値コンバーターと総称することがあります。

値コンバーター

XAML では、さまざまなシナリオで値コンバーターが使用されます。 XAML におけるさまざまな種類の値コンバーターは次のとおりです。

  • 型コンバーター

  • マークアップ拡張機能

  • 値シリアライザー

  • XAML テキスト構文のロジックを提供する関連クラスまたはサポート クラス

型コンバーター

.NET XAML サービスの定義では、型コンバーターは CLR の TypeConverter クラスの派生クラスです。 TypeConverter は、XAML が登場する前から .NET に存在していたクラスです。 本来の目的は、プロパティ ウィンドウや、IDE のプロパティ用に同様のテキスト ベースの編集をサポートすることでした。 .NET に導入された XAML では、TypeConverter を使用して、テキスト構文 (属性値または XAML 値ノードに含まれるもの) がオブジェクトに変換されます。 また、TypeConverter を使用して、オブジェクト値をテキスト構文にシリアル化することもできます。 また、TypeConverter は、Windows Presentation Foundation (WPF) および Windows Communication Foundation (WCF) における以前のフレームワーク固有の XAML の実装でも使用されていました。 XAML の TypeConverter の詳細については、「 Type Converters for XAML Overviewといった以前のフレームワーク固有の XAML 実装でも使用されていました。

マークアップ拡張機能

.NET XAML サービスの実装では、マークアップ拡張は MarkupExtension クラスの派生クラスです。 この形式のマークアップ拡張機能は、XAML 言語で考案された概念です。 マークアップ拡張機能は、サービス クラスを呼び出してロジックを提供する、拡張性を持ったエスケープ シーケンスのようなものと考えることができます。 マークアップの観点からすると、XAML プロセッサは、テキスト文字列内の左中かっこ ({) で始まるテキスト シーケンスによってマークアップ拡張機能を汎用的に認識します。

マークアップ拡張機能は、型コンバーターとは異なります。 型コンバーターは、通常、型またはメンバーに関連付けられ、 オブジェクト グラフの作成またはシリアル化においてそれらのエンティティに関連付けられたテキスト構文が検出されると呼び出されます。

マークアップ拡張機能は、単一のサポート サービス クラスに関連付けられますが、任意のメンバー値に適用できます。 (ただし、独自のマークアップ拡張を実装し、サービス コンテキストを使用することによって、その使用を特定のメンバーまたは変換先の型に意図的に制限できます)。マークアップ拡張で、型コンバーターの関連付けをオーバーライドできます。 または、テキスト構文をサポートしないメンバーの属性値を指定するためにマークアップ拡張機能を使用することもできます。

XAML でのマークアップ拡張機能の実装パターンの詳細については、「 Markup Extensions for XAML Overview」を参照してください。

値シリアライザー

ValueSerializer は、オブジェクトを文字列に変換するために最適化された特殊な型コンバーターです。 XAML の ValueSerializer は、 ConvertFrom メソッドを一切実装しません。 ValueSerializer 実装は、 TypeConverter 実装と同様の方法でサービスを取得します 仮想メソッドは入力 context パラメーターを提供しています。 context パラメーターの型は IValueSerializerContextであり、 IServiceProvider インターフェイスを継承し、 GetService メソッドを持ちます。

XAML 型システムと、シリアル化のために XAML ノード ループ処理を使用する XAML ライターの実装では、型またはメンバーに関連付けられた値コンバーターは、独自の XamlType.ValueSerializer プロパティによって報告されます。 シリアル化を実行する XAML ライターにとっては、 XamlType.TypeConverterXamlType.ValueSerializer が存在する場合には、読み込みパス用に型コンバーターを使用し、保存パス用に値シリアライザーを使用する必要があるということを意味しています。 XamlType.TypeConverter は存在するものの、 XamlType.ValueSerializernullの場合は、保存パス用にも型コンバーターを使用します。

その他の値コンバーター

値コンバーターは、型コンバーターまたはマークアップ拡張機能の特定のパターンを超えて拡張できます。 ただし、このカスタマイズを行うには、.NET XAML サービスによって提供される XAML 型システムを再定義する必要もあります。 既存の XAML 型システムには、型コンバーター、マークアップ拡張機能、および値シリアライザー向けの表現とレポート システムがありますが、値変換のカスタム形式向けの表現とレポート システムはありません。 カスタム値コンバーターを作成する場合は、 XamlValueConverter<TConverterBase> 型を使用します。

型コンバーターとマークアップ拡張機能の組み合わせ

マークアップ拡張機能と型コンバーターは、XAML の異なる状況で使用されます。 マークアップ拡張機能の使用時にはコンテキストを利用できますが、マークアップ拡張機能が値を提供するプロパティの型変換動作は一般にマークアップ拡張機能の実装ではチェックされません。 つまり、マークアップ拡張機能が ProvideValue 出力としてテキスト文字列を返す場合でも、特定のプロパティまたはプロパティ値型に適用される、その文字列に対する型変換動作は呼び出されません。 一般に、マークアップ拡張機能の目的は、型コンバーターを呼び出さずに文字列を処理してオブジェクトを返すことです。

値コンバーターのサービス コンテキスト

値コンバーターを実装する際には、通常、値コンバーターが適用されるコンテキストにアクセスする必要があります。 このコンテキストは、サービス コンテキストと呼ばれます。 サービス コンテキストには、アクティブな XAML スキーマ コンテキスト、XAML スキーマ コンテキストや XAML オブジェクト ライターによって提供される型マッピング システムへのアクセスなどの情報が含まれます。 値コンバーターで使用可能なサービス コンテキストとサービス コンテキストが提供するサービスへのアクセス方法の詳細については、「 Service Contexts Available to Type Converters and Markup Extensions」を参照してください。

関連項目