XAML の型コンバーターとマークアップ拡張機能
型コンバーターとマークアップ拡張は、XAML 型システムと XAML ライターがオブジェクト グラフ コンポーネントの生成に使用する 2 つの手法です。 これらはいくつかの特性を共有しますが、型コンバーターとマークアップ拡張は XAML ノード ストリームで異なる方法で表されます。 このドキュメント セットでは、型コンバーター、マークアップ拡張、および同様のコンストラクトを値コンバーターと総称することがあります。
値コンバーター
XAML では、値コンバーターはさまざまなシナリオで使用されます。 次の一覧は、XAML のさまざまな型の値コンバーターを示しています。
型コンバーター
マークアップ拡張機能
値シリアライザー
XAML テキスト構文のロジックを提供する関連クラスまたはサポート クラス
型コンバーター
.NET XAML サービス定義では、型コンバーターは CLR TypeConverter クラスから派生するクラスです。 TypeConverter は、XAML が存在する前に .NET に存在していたクラスです。 元の目的は、IDE プロパティのプロパティ ウィンドウと同様のテキストベースの編集メタファーをサポートすることでした。 XAML から .NET への導入では、TypeConverter を使用して、テキスト構文 (属性値または XAML 値ノードに含まれる) をオブジェクトに変換します。 TypeConverter を使用して、オブジェクト値をテキスト構文にシリアル化することもできます。 TypeConverter は、Windows Presentation Foundation (WPF) と Windows Communication Foundation (WCF) の以前のフレームワーク固有の XAML 実装でも使用されていました。 XAML の TypeConverter の詳細については、「XAML の 型コンバーターの概要」を参照してください。
マークアップ拡張
.NET XAML サービスの実装では、マークアップ拡張は、MarkupExtension クラスから派生するクラスです。 マークアップ拡張は、この形式で XAML 言語によって生成される概念です。 マークアップ拡張は、そのロジックを提供するためにサービス クラスを呼び出す拡張可能なエスケープ シーケンスのようなものと考えることができます。 マークアップに関しては、XAML プロセッサは、テキスト文字列の中かっこ ({) で始まるテキスト シーケンスによってマークアップ拡張を汎用的に認識します。
マークアップ拡張は型コンバーターとは異なります。 型コンバーターは、通常、型またはメンバーに関連付けられます。 これらは、オブジェクト グラフの作成またはシリアル化で、それらのエンティティに関連付けられているテキスト構文が検出されたときに呼び出されます。
マークアップ拡張は 1 つのサポート サービス クラスに関連付けられますが、任意のメンバー値に適用できます。 (ただし、サービス コンテキストを使用して、マークアップ拡張機能を実装して、その使用を特定のメンバーまたは変換先の型に意図的に制限することができます)。マークアップ拡張は、型コンバーターの関連付けをオーバーライドできます。 または、テキスト構文をサポートしないメンバーの属性値を指定するために使用できます。
XAML のマークアップ拡張機能の実装パターンの詳細については、「XAML のマークアップ拡張機能の概要
値シリアライザー
ValueSerializer は、オブジェクトを文字列に変換するために最適化された特殊な型コンバーターです。 XAML の ValueSerializer では、ConvertFrom
メソッドがまったく実装されない場合があります。
ValueSerializer 実装では、TypeConverter 実装のような方法でサービスを取得します。 仮想メソッドは、入力 context
パラメーターを提供します。
context
パラメーターは IValueSerializerContext型で、IServiceProvider インターフェイスから継承され、GetService メソッドを持ちます。
XAML 型システムと、シリアル化に XAML ノード ループ処理を使用する XAML ライター実装では、型またはメンバーに関連付けられている値コンバーターは、独自の XamlType.ValueSerializer プロパティによって報告されます。 シリアル化を実行する XAML ライターにとっての意味は、XamlType.TypeConverter と XamlType.ValueSerializer が存在する場合は、読み込みパスに型コンバーターを使用し、値シリアライザーを保存パスに使用する必要があるということです。
XamlType.TypeConverter が存在するが、XamlType.ValueSerializer が null
場合は、型コンバーターも保存パスに使用されます。
その他の値コンバーター
値コンバーターは、型コンバーターまたはマークアップ拡張の特定のパターンを超えて拡張できます。 ただし、このカスタマイズでは、.NET XAML サービスによって提供される XAML 型システムの再定義も必要になります。 既存の XAML 型システムには、型コンバーター、マークアップ拡張、および値シリアライザーの表現とレポート システムがありますが、カスタム形式の値変換には使用できません。 カスタム値コンバーターを作成する場合は、XamlValueConverter<TConverterBase> 型を使用します。
型コンバーターとマークアップ拡張の組み合わせ
マークアップ拡張と型コンバーターは、XAML のさまざまな状況で使用されます。 マークアップ拡張機能の使用にはコンテキストを使用できますが、マークアップ拡張機能が値を提供するプロパティの型変換動作は、通常、マークアップ拡張機能の実装ではチェックされません。 つまり、マークアップ拡張機能がテキスト文字列を ProvideValue
出力として返した場合でも、特定のプロパティまたはプロパティ値の型に適用された文字列に対する型変換動作は呼び出されません。 一般に、マークアップ拡張の目的は、文字列を処理し、型コンバーターを使用せずにオブジェクトを返します。
値コンバーターのサービス コンテキスト
値コンバーターを実装する場合、多くの場合、値コンバーターが適用されるコンテキストにアクセスする必要があります。 このコンテキストは、サービス コンテキストと呼ばれます。 サービス コンテキストには、アクティブな XAML スキーマ コンテキスト、XAML スキーマ コンテキストと XAML オブジェクト ライターが提供する型マッピング システムへのアクセスなどの情報が含まれる場合があります。 値コンバーターで使用できるサービス コンテキストと、サービス コンテキストが提供する可能性があるサービスにアクセスする方法の詳細については、「型コンバーターとマークアップ拡張で使用できるサービス コンテキスト」を参照してください。
関連項目
- MarkupExtension
- XamlObjectWriter
- XAML 用マークアップ拡張機能の 概要
- XAML の 型コンバーターの概要
- 型コンバーターとマークアップ拡張 で使用できるサービス コンテキストの
.NET Desktop feedback