XAML の型コンバーターおよびマークアップ拡張機能
型コンバーターとマークアップ拡張機能は、XAML 型システムと XAML ライターが、オブジェクト グラフ コンポーネントを生成するために使用する 2 つの方法です。 型コンバーターとマークアップ拡張機能は、一部の特性を共有しますが、XAML ノード ストリームでは異なる方法で表されます。 このドキュメント セットでは、型コンバーター、マークアップ拡張機能、およびこれに類似した構造は、値コンバーターと総称されることもあります。
このトピックは、次のセクションで構成されています。
- 値コンバーター
- 型コンバーター
- マークアップ拡張
- 値シリアライザー
- その他の値コンバーター
- 型コンバーターとマークアップ拡張機能の組み合わせ
- 値コンバーターのサービス コンテキスト
- 関連トピック
値コンバーター
XAML では、さまざまなシナリオで値コンバーターが使用されます。 次の一覧に、XAML におけるさまざまな種類の値コンバーターを示します。
型コンバーター
マークアップ拡張機能
値シリアライザー
XAML テキスト構文にロジックを提供する関連クラス、またはサポート クラス
型コンバーター
.NET Framework XAML サービスの定義では、型コンバーターは CLR TypeConverter クラスから派生したクラスです。 TypeConverter は、XAML が現れる前から Microsoft .NET Framework に存在していたクラスです。 当初の目的は、プロパティ ウィンドウや、IDE プロパティの同様のテキスト ベースの編集の要素をサポートすることでした。 .NET Framework に導入された XAML では、TypeConverter を使用して、テキスト構文 (属性値または XAML 値ノードに含まれる) をオブジェクトに変換します。また、TypeConverter を使用して、オブジェクト値をテキスト構文にシリアル化することもできます。 さらに、Windows Presentation Foundation (WPF) および Windows Communication Foundation (WCF) の以前のフレームワーク固有の XAML 実装では TypeConverter も使用されていました。XAML における TypeConverter の詳細については、「XAML の型コンバーターの概要」を参照してください。
マークアップ拡張
.NET Framework XAML サービス実装では、マークアップ拡張機能は、MarkupExtension クラスから派生するクラスです。 マークアップ拡張機能とは、このフォームでは、XAML 言語から派生した概念です。 マークアップ拡張機能は、サービス クラスを呼び出してロジックを指定する、拡張性を持ったエスケープ シーケンスのようなものとして考えることができます。 マークアップの観点から見ると、XAML プロセッサは、文字列の左中かっこ ({) で始まるテキスト シーケンスによってマークアップ拡張機能を汎用的に認識します。
マークアップ拡張機能は、型コンバーターとは異なります。 型コンバーターは、一般に型またはメンバーに関連付けられ、 オブジェクト グラフの作成またはシリアル化においてそれらのエンティティに関連付けられたテキスト構文が検出されると呼び出されます。
マークアップ拡張機能は、単一のサポート サービス クラスに関連付けられますが、任意のメンバー値に適用できます (ただし、マークアップ拡張機能は、サービス コンテキストを使用することで、その用途を特定のメンバーまたは変換先の型に意図的に制限できる点に注意してください)。 マークアップ拡張機能は、型コンバーターの関連付けをオーバーライドできます。 テキスト構文をサポートしないメンバーの属性値を指定するためにマークアップ拡張機能を使用することもできます。
XAML でのマークアップ拡張機能の実装パターンの詳細については、「XAML のマークアップ拡張機能の概要」を参照してください。
メモ |
---|
MarkupExtension 型および ValueSerializer 型はどちらも、System.Xaml 名前空間ではなく、System.Windows.Markup 名前空間にあります。これは、これらの型が、その他の方法で文字列 Windows を含む CLR 名前空間を設定する WPF または Windows Forms 技術固有の型であることを示すものではありません。MarkupExtension および ValueSerializer は System.Xaml アセンブリにあり、特定のフレームワークの依存関係はありません。.NET Framework 3.0 では、これらの型はその CLR 名前空間に存在し、.NET Framework 4 でも引き続きその CLR 名前空間に保持されているので、既存の WPF プロジェクトの参照は破損しません。詳細については、「WPF から System.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 Framework XAML サービスによって指定される XAML 型システムも再定義する必要があります。 既存の XAML 型システムには、型コンバーター、マークアップ拡張機能、および値シリアライザー向けの表現とレポート システムがありますが、値変換のカスタム形式向けの表現とレポート システムはありません。 カスタム値コンバーターを作成する場合は、XamlValueConverter<TConverterBase> 型を使用します。
型コンバーターとマークアップ拡張機能の組み合わせ
マークアップ拡張機能と型コンバーターは、XAML の異なる状況で使用されます。 マークアップ拡張機能の使用時にはコンテキストを利用できますが、マークアップ拡張機能が値を提供するプロパティの型変換動作は一般にマークアップ拡張機能の実装ではチェックされません。 つまり、マークアップ拡張機能が ProvideValue 出力としてテキスト文字列を返す場合でも、特定のプロパティまたはプロパティ値型に適用される、その文字列に対する型変換動作は呼び出されません。 一般に、マークアップ拡張機能の目的は、型コンバーターを呼び出さずに文字列を処理しオブジェクトを返すことです。
値コンバーターのサービス コンテキスト
値コンバーターを実装する場合は、通常、値コンバーターが適用されるコンテキストにアクセスする必要があります。 このコンテキストは、サービス コンテキストとして知られています。 このサービス コンテキストには、アクティブな XAML スキーマ コンテキスト、XAML スキーマ コンテキストや XAML オブジェクト ライターが指定する型マッピング システムへのアクセスなどの情報が含まれます。 値コンバーターで使用可能なサービス コンテキストとサービス コンテキストが提供するサービスへのアクセス方法の詳細については、「型コンバーターおよびマークアップ拡張機能で使用できるサービス コンテキスト」を参照してください。