TypeConverters および XAML
更新 : 2007 年 11 月
TypeConverter クラスは、Extensible Application Markup Language (XAML) の属性でプロパティ値として使用できるカスタムのマネージ クラスの実装の一部として重要な役割を果たします。カスタム クラスを作成し、そのクラスのインスタンスを Extensible Application Markup Language (XAML) の設定可能な属性値として使用できるようにしたい場合は、そのクラスに TypeConverterAttribute を適用するか、またはカスタム TypeConverter クラスを作成するかのいずれかまたは両方を行う必要があります。
このトピックには次のセクションが含まれています。
- XAML と文字列値
- 型コンバータの実装
- TypeConverterAttribute の適用
- 関連トピック
XAML と文字列値
XAML で属性値を設定するとき、その値の初期型は String です。Double などの他のプリミティブであっても、XAML プロセッサにとっては最初は文字列ですが、文字列以外の他のプリミティブ値への変換や列挙体の名前付きの値からの変換は、型変換が組み込まれているため比較的簡単です。
属性値を処理するために、XAML プロセッサは 2 つの情報を必要とします。第 1 の情報は、設定するプロパティの値型です。属性値を定義し、XAML で処理される文字列値はすべて、最終的にその型の値に変換 (解決) される必要があります。値がプリミティブの場合は、文字列の直接的な変換が試みられます。値が列挙体の場合は、文字列を使用してその列挙体で一致する名前がチェックされます。値がプリミティブでも列挙体でもない場合は、問題の型は、変換される文字列に基づいて、型のインスタンスまたは値を提供できる必要があります。
特殊なケースとしては、マークアップ拡張機能があります。プロパティの型やその他の考慮事項を確認する前に、XAML プロセッサは、マークアップ拡張機能の使用を処理する必要があります。通常、マークアップ拡張機能の目的は、文字列を処理してオブジェクトを返すことです。返されるオブジェクトとプロパティの型が一致する場合、マークアップ拡張機能は、マークアップ拡張機能の実装コードの外部で型変換が発生しない方法で、プロパティに値を提供します。マークアップ拡張機能が必要となる典型的な状況の 1 つとして、既存のオブジェクトへの参照が挙げられます (状態のない型コンバータは、必要とは限らない新しいインスタンスを生成するだけです)。マークアップ拡張機能の詳細については、「マークアップ拡張機能と XAML」を参照してください。
TypeConverter
値がプリミティブ型でも列挙型でもなく、マークアップ拡張機能も使用されていない場合は、XAML を処理するときに、String を適切な値または新しいインスタンスに変換するなんらかの手段が必要です。これが、TypeConverter 実装の役割です。TypeConverter では、XAML の処理を目的とする文字列の変換に関係する 4 つのメンバが定義されています。
これらのうち、最も重要なメソッドは ConvertFrom です。このメソッドは、入力文字列を必要なオブジェクト型に変換します。
次に重要なメソッドは ConvertTo です。WPF アプリケーションがマークアップ表現に変換される場合 (たとえば、XAML に保存される場合)、ConvertTo は値のマークアップ表現の生成を行います。
CanConvertTo と CanConvertFrom は、TypeConverter 実装の機能をサービスが照会するときに使用されるサポート メソッドです。特定の状況で (特に String 型に対して) true を返すように、これらのメソッドを実装する必要があります。
型コンバータの実装
ConvertFrom の実装
XAML をサポートする TypeConverter の実装として使用できるためには、そのコンバータの ConvertFrom メソッドが、value パラメータとして文字列を受け入れる必要があります。文字列が有効な形式であり、TypeConverter 実装で変換できる場合、返されるオブジェクトはプロパティで予想される型へのキャストをサポートする必要があります。それ以外の場合は、ConvertFrom 実装は null を返す必要があります。
各 TypeConverter の実装には、変換に有効な文字列の構成内容に関する独自の解釈を含めることができます。また、パラメータとして渡された型説明やカルチャ情報を使用したり無視したりすることもできます。ただし、WPF XAML 処理が、値を型説明コンテキストに一切渡さない場合があり、xml-lang に基づくカルチャを渡さない場合もあります。
メモ : |
---|
文字列の書式の要素として、中かっこ文字、特に { は使用しないでください。これらの文字は、マークアップ拡張シーケンスの開始および終了を示す文字として予約されています。 |
ConvertTo の実装
ConvertTo はシリアル化のサポートで使用される場合があります。カスタム型のシリアル化のサポートは、絶対要件ではありません。ただし、コントロールを実装する場合、またはクラスの機能または設計の一部としてシリアル化を使用する場合は、ConvertTo を実装する必要があります。
XAML をサポートする TypeConverter の実装として使用できるためには、そのコンバータの ConvertTo メソッドが、value パラメータとして、サポートされる型のインスタンス (または値) を受け入れる必要があります。destinationType パラメータが String 型の場合は、返されるオブジェクトは String にキャストできる必要があります。返される文字列は、value のシリアル化された値を表す必要があります。理想的には、選択するシリアル化形式は、その文字列が同じコンバータの ConvertFrom の実装に渡された場合に、情報の大きな損失が発生することなく、同じ値を生成できる必要があります。
値をシリアル化できない場合、またはコンバータがシリアル化をサポートしていない場合は、ConvertTo の実装は null を返す必要があり、この場合に例外をスローすることもできます。
destinationType パラメータが String 型でない場合は、独自のコンバータの処理を選択できます。通常は、基本実装の処理に戻ります。
各 TypeConverter の実装には、変換に有効な文字列の構成内容に関する独自の解釈を含めることができます。また、パラメータとして渡された型説明やカルチャ情報を使用したり無視したりすることもできます。
メモ : |
---|
文字列の書式の要素として、中かっこ文字、特に { は使用しないでください。これらの文字は、マークアップ拡張シーケンスの開始および終了を示す文字として予約されています。 |
CanConvertTo の実装
CanConvertTo の実装は、String 型の destinationType に対しては true を返し、それ以外の場合は基本実装に任せます。
CanConvertFrom の実装
CanConvertFrom の実装は、String 型の sourceType に対しては true を返し、それ以外の場合は基本実装に任せます。
TypeConverterAttribute の適用
カスタムの型コンバータをカスタム クラス用の機能する型コンバータとして使用するには、.NET Framework 属性 TypeConverterAttribute をクラス定義に適用する必要があります。属性で指定する ConverterTypeName は、カスタム型コンバータの型名である必要があります。この属性を適用すると、プロパティの型がカスタム クラス型を使用する値を XAML プロセッサが処理する際に、入力文字列を処理して、オブジェクト インスタンスを返すことができます。
また、プロパティごとに型コンバータを提供することもできます。クラス定義に .NET Framework 属性 TypeConverterAttribute を適用する代わりに、プロパティ定義 (メイン定義内の get/set 実装ではなくメイン定義自体) に適用します。プロパティの型は、カスタム型コンバータによって処理される型と一致する必要があります。この属性を適用すると、そのプロパティの値を XAML プロセッサが処理する際に、入力文字列を処理して、オブジェクト インスタンスを返すことができます。プロパティごとの型コンバータは、Microsoft .NET Framework のプロパティ型を使用する場合、またはクラス定義を制御できず、TypeConverterAttribute を適用できない他のライブラリのプロパティ型を使用する場合に、特に役立ちます。