XAML の型コンバーターの概要
型コンバーターは、XAML マークアップの文字列からオブジェクト グラフ内の特定のオブジェクトに変換するオブジェクト ライターのロジックを提供します。 .NET XAML Services では、型コンバーターは、TypeConverterから派生するクラスである必要があります。 一部のコンバーターは XAML 保存パスもサポートしており、シリアル化マークアップでオブジェクトを文字列形式にシリアル化するために使用できます。 このトピックでは、XAML で型コンバーターを呼び出す方法とタイミングについて説明し、TypeConverterのメソッドオーバーライドの実装に関するアドバイスを提供します。
型変換の概念
次のセクションでは、XAML で文字列を使用する方法と、.NET XAML Services のオブジェクト ライターが型コンバーターを使用して XAML ソースで検出される文字列値の一部を処理する方法に関する基本的な概念について説明します。
XAML と文字列の値
XAML ファイルで属性値を設定する場合、その値の初期型は一般的な意味での文字列であり、XML 意味の文字列属性値です。 Double などの他のプリミティブも、最初は XAML プロセッサに対する文字列です。
ほとんどの場合、XAML プロセッサでは、属性値を処理するために 2 つの情報が必要です。 最初の情報は、設定されているプロパティの値型です。 属性値を定義し、XAML で処理される文字列は、最終的にその型の値に変換または解決する必要があります。 値が XAML パーサーによって認識されるプリミティブ (数値など) の場合は、文字列の直接変換が試行されます。 属性の値が列挙型を参照している場合、指定された文字列は、その列挙型の名前付き定数と一致する名前をチェックします。 値がパーサーが認識するプリミティブまたは列挙型の定数名でない場合、該当する型は、変換された文字列に基づく値または参照を提供できる必要があります。
手記
XAML 言語ディレクティブでは、型コンバーターは使用されません。
型コンバーターとマークアップ拡張
マークアップ拡張機能の使用は、プロパティの種類やその他の考慮事項をチェックする前に、XAML プロセッサによって処理される必要があります。 たとえば、通常、属性として設定されているプロパティに型変換があるが、特定のケースではマークアップ拡張機能の使用によって設定されている場合、マークアップ拡張機能の動作が最初に処理されます。 マークアップ拡張が必要な一般的な状況の 1 つは、既に存在するオブジェクトへの参照を作成することです。 このシナリオでは、ステートレス型コンバーターは新しいインスタンスのみを生成できます。これは望ましくない可能性があります。 マークアップ拡張機能の詳細については、「XAML のマークアップ拡張機能の概要」を参照してください。
ネイティブ型コンバーター
Windows Presentation Foundation (WPF) および .NET XAML サービスの実装には、ネイティブ型変換処理を持つ特定の CLR 型があります。 ただし、これらの CLR 型は、従来はプリミティブと考えまれていません。 このような型の例として、DateTimeがあります。 その理由の 1 つは、.NET Framework アーキテクチャのしくみです。DateTime 型は、.NET で最も基本的なライブラリである mscorlib で定義されています。 DateTime は、依存関係を導入する別のアセンブリから取得される属性 (TypeConverterAttribute は System からの属性) で属性付けすることはできません。 そのため、属性付けによる通常の型コンバーター検出メカニズムはサポートできません。 代わりに、XAML パーサーにはネイティブ処理が必要な型の一覧があり、実際のプリミティブの処理方法と同様にこれらの型が処理されます。 DateTimeの場合、この処理には Parseの呼び出しが含まれます。
型コンバーターの実装
次のセクションでは、TypeConverter クラスの API について説明します。
TypeConverter
.NET XAML サービスでは、XAML の目的で使用されるすべての型コンバーターは、基底クラス TypeConverterから派生するクラスです。 TypeConverter クラスは、XAML が存在する前のバージョンの .NET Framework に存在しました。元の TypeConverter シナリオの 1 つは、ビジュアル デザイナーのプロパティ エディターに文字列変換を提供することです。
XAML の場合、TypeConverter のロールが展開されます。 XAML の目的上、TypeConverter は、特定の文字列変換と文字列からの変換のサポートを提供するための基本クラスです。 From-string を使用すると、XAML から文字列属性値を解析できます。 To-string を使用すると、シリアル化のために、特定のオブジェクト プロパティの実行時値を XAML の属性に戻す処理が可能になる場合があります。
TypeConverter では、XAML 処理の目的で文字列への変換と文字列からの変換に関連する 4 つのメンバーを定義します。
これらのメンバーのうち、最も重要なメソッドは、入力文字列を必要なオブジェクト型に変換する ConvertFromです。 ConvertFrom メソッドを実装して、より広い範囲の型をコンバーターの目的の変換先の型に変換できます。 そのため、ランタイム変換のサポートなど、XAML を超える目的に対応できます。 ただし、XAML を使用する場合は、String 入力を処理できるコード パスのみが重要です。
2 番目に重要な方法は、ConvertToです。 アプリケーションがマークアップ表現に変換される場合 (たとえば、XAML にファイルとして保存されている場合)、ConvertTo は、マークアップ表現を生成する XAML テキスト ライターの大規模なシナリオに関係します。 この場合、XAML の重要なコード パスは、呼び出し元が Stringの destinationType
を渡すときです。
CanConvertTo と CanConvertFrom は、サービスが TypeConverter 実装の機能を照会するときに使用されるサポート メソッドです。 コンバーターの同等の変換メソッドがサポートする型固有のケースの true
を返すには、これらのメソッドを実装する必要があります。 XAML の場合、これは通常、String 型を意味します。
XAML のカルチャ情報とタイプコンバーター
各 TypeConverter 実装では、変換に有効な文字列を一意に解釈できます。また、パラメーターとして渡される型の説明を使用したり無視したりすることもできます。 カルチャと XAML 型の変換に関する重要な考慮事項は次のとおりです。ただし、属性値としてローカライズ可能な文字列を使用することは XAML でサポートされていますが、これらのローカライズ可能な文字列を特定のカルチャ要件を持つ型コンバーター入力として使用することはできません。 この制限は、XAML 属性値の型コンバーターには、en-US
カルチャを使用する固定言語の XAML 処理動作が必要であるためです。 この制限の設計上の理由の詳細については、XAML 言語仕様 (
カルチャが問題になる可能性がある例として、一部のカルチャでは、文字列形式の数値の小数点区切り記号としてピリオドの代わりにコンマを使用します。 この使用は、多くの既存の型コンバーターの動作と競合します。これは、区切り記号としてコンマを使用することです。 周囲の XAML で xml:lang
を通じてカルチャを渡しても、問題は解決されません。
ConvertFrom の実装
XAML をサポートする TypeConverter 実装として使用できるようにするには、そのコンバーターの ConvertFrom メソッドで、value
パラメーターとして文字列を受け入れる必要があります。 文字列が有効な形式で、TypeConverter 実装によって変換できる場合、返されるオブジェクトは、プロパティで予期される型へのキャストをサポートする必要があります。 それ以外の場合、ConvertFrom 実装は null
を返す必要があります。
各 TypeConverter 実装では、変換の有効な文字列を構成するものを一意に解釈できます。また、パラメーターとして渡される型の説明やカルチャ コンテキストを使用または無視することもできます。 ただし、WPF XAML 処理では、すべてのケースで型記述コンテキストに値が渡されない場合があり、また、xml:lang
に基づいてカルチャを渡さない場合もあります。
手記
文字列形式の要素として、中かっこ ({})、具体的には開始中かっこ ({) を使用しないでください。 これらの文字は、マークアップ拡張シーケンスのエントリおよび終了として予約されています。
型コンバーターが .NET XAML Services オブジェクト ライターから XAML サービスにアクセスできる必要があるが、コンテキストに対して行われた GetService 呼び出しではそのサービスが返されない場合は、例外をスローすることをお勧めします。
ConvertTo の実装
ConvertTo は、シリアル化のサポートに使用される可能性があります。 カスタム型とその型コンバーターの ConvertTo によるシリアル化のサポートは、絶対要件ではありません。 ただし、コントロールを実装する場合、またはクラスの機能または設計の一部としてシリアル化を使用する場合は、ConvertToを実装する必要があります。
XAML をサポートする TypeConverter 実装として使用できるようにするには、そのコンバーターの ConvertTo メソッドで、value
パラメーターとしてサポートされている型 (または値) のインスタンスを受け入れる必要があります。 destinationType
パラメーターが String型の場合、返されるオブジェクトを Stringとしてキャストできる必要があります。 返される文字列は、value
のシリアル化された値を表す必要があります。 理想的には、選択したシリアル化形式では、その文字列が同じコンバーターの ConvertFrom 実装に渡された場合と同じ値を生成でき、情報が大幅に失われる必要はありません。
値をシリアル化できない場合、またはコンバーターがシリアル化をサポートしていない場合、ConvertTo 実装は null
を返す必要があり、例外をスローできます。 ただし、例外をスローする場合は、CanConvertTo 実装の一部としてその変換を使用できないことを報告して、例外を回避するために最初に CanConvertTo を確認するベスト プラクティスがサポートされるようにする必要があります。
destinationType
パラメーターが String型でない場合は、独自のコンバーター処理を選択できます。 通常、基本実装の処理に戻します。基本 ConvertTo では特定の例外が発生します。
型コンバーターが .NET XAML Services オブジェクト ライターから XAML サービスにアクセスできる必要があるが、コンテキストに対して行われた GetService 呼び出しではそのサービスが返されない場合は、例外をスローすることをお勧めします。
CanConvertFrom の実装
CanConvertFrom 実装では、String 型の sourceType
に対しては true
を返し、それ以外の場合はベース実装に引き継ぐ必要があります。 CanConvertFromから例外をスローしないでください。
CanConvertTo の実装
CanConvertTo 実装は、destinationType
の型が Stringの場合には true
を返し、それ以外の場合は基本実装に委ねる必要があります。 CanConvertToから例外をスローしないでください。
TypeConverterAttribute の適用
カスタム型コンバーターを .NET XAML Services によってカスタム クラスの動作型コンバーターとして使用するには、クラス定義に TypeConverterAttribute を適用する必要があります。 属性を使用して指定する ConverterTypeName は、カスタム型コンバーターの型名である必要があります。 この属性を適用すると、XAML プロセッサがプロパティ型でカスタム クラス型を使用する値を処理するときに、文字列を入力してオブジェクト インスタンスを返すことができます。
プロパティごとに型コンバーターを提供することもできます。 クラス定義に TypeConverterAttribute を適用する代わりに、プロパティ定義 (その中の get
/set
実装ではなく、メイン定義) に適用します。 プロパティの型は、カスタム型コンバーターによって処理される型と一致する必要があります。 この属性を適用すると、XAML プロセッサがそのプロパティの値を処理するときに、入力文字列を処理してオブジェクト インスタンスを返すことができます。 プロパティごとの型コンバーター手法は、Microsoft .NET Framework またはクラス定義を制御できず、そこに TypeConverterAttribute を適用できない他のライブラリからプロパティ型を使用する場合に便利です。
カスタム添付メンバーの型変換動作を指定するには、アタッチされたメンバーの実装パターンの Get
アクセサー メソッドに TypeConverterAttribute を適用します。
マークアップ拡張機能の実装からサービス プロバイダー コンテキストにアクセスする
使用可能なサービスは、どの値コンバーターでも同じです。 違いは、各値コンバーターがサービス コンテキストを受け取る方法です。 利用可能なサービスとサービスへのアクセスについては、「XAMLの型コンバーターとマークアップ拡張機能
XAML ノード ストリームの型コンバーター
XAML ノード ストリームを使用している場合、型コンバーターのアクションまたは最終結果はまだ実行されていません。 読み込みパスでは、読み込むために最終的に型変換が必要な属性文字列は、開始メンバーと終了メンバー内のテキスト値として残ります。 この操作に最終的に必要になる型コンバーターは、XamlMember.TypeConverter プロパティを使用して決定できます。 ただし、XamlMember.TypeConverter から有効な値を取得するには、基になるメンバーまたはメンバーが使用するオブジェクト値の型を介してこのような情報にアクセスできる XAML スキーマ コンテキストが必要です。 型変換動作を呼び出すには、型マッピングとコンバーター インスタンスの作成が必要になるため、XAML スキーマ コンテキストも必要です。
参照
- TypeConverterAttribute
- XAML の
型コンバーターとマークアップ拡張 - XAML の概要 (WPF .NET)
.NET Desktop feedback