次の方法で共有


XAML のジェネリック

System.Xaml に実装されている .NET XAML サービスでは、ジェネリック CLR 型の使用がサポートされています。 このサポートには、型引数としてのジェネリックの制約の指定と、ジェネリック コレクションの場合の適切な Add メソッドの呼び出しによる制約の適用が含まれます。 このトピックでは、XAML でのジェネリック型の使用と参照の側面について説明します。

x:TypeArguments

x:TypeArguments は、XAML 言語で定義されたディレクティブです。 それをジェネリック型によってバッキングされる XAML 型のメンバーとして使用するときは、x:TypeArguments によってジェネリックの制約型引数がバッキング コンストラクターに渡されます。 .NET XAML サービスでの x:TypeArguments の使用に関連する参照構文と構文の例については、「x:TypeArguments ディレクティブ」を参照してください。

x:TypeArguments は文字列を受け取り、型コンバーターのバッキングを備えているため、通常、XAML で使用するときは属性として宣言されます。

XAML ノード ストリームでは、x:TypeArguments によって宣言されている情報は、ノード ストリーム内の StartObject の位置にある XamlType.TypeArguments から取得できます。 XamlType.TypeArguments の戻り値は、XamlType 値のリストです。 XAML 型がジェネリック型を表すかどうかの判断は、XamlType.IsGeneric を呼び出すことによって行うことができます。

XAML でのジェネリックのルールと構文規則

XAML では、ジェネリック型は常に制約のあるジェネリックとして表される必要があります。 制約のないジェネリックは、XAML 型システムまたは XAML ノード ストリームには存在せず、XAML マークアップでは表現できません。 x:TypeArguments によって参照されているジェネリックの入れ子にされた型制約である場合、または x:Type によってジェネリック型の CLR 型参照が提供される場合は、XAML 属性構文内でジェネリックを参照できます。 ジェネリックの参照は、.NET XAML サービスで定義されている XamlTypeTypeConverter クラスによってサポートされます。

XamlTypeTypeConverter によって有効にされる XAML 属性構文形式では、ジェネリックの型や制約に山かっこを使用する一般的な MSIL/CLR 構文規則が変更され、代わりにかっこが制約コンテナーに使用されます。 例については、「x:TypeArguments ディレクティブ」を参照してください。

ジェネリックと XAML 2009 の機能

共通言語プリミティブの XAML 型を取得するために、CLR の基本データ型をマップするのではなく、XAML 2009 を使用する場合は、x:TypeArguments 内の情報項目として XAML 2009 の組み込み型を使用できます。 たとえば、次のように宣言できます (プレフィックスのマッピングは示されていませんが、x は XAML 2009 用の XAML 言語の XAML 名前空間です)。

<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>

WPF でのジェネリックのサポート

対象として WPF が明示的に指定されている XAML 2006 で使用する場合は、x:TypeArguments と同じ要素で x:Class も指定する必要があり、その要素は XAML ドキュメントのルート要素である必要があります。 ルート要素は、少なくとも 1 つの型引数でジェネリック型にマップしている必要があります。 たとえば PageFunction<T> です。

ジェネリックの使用のサポートに関する回避策としては、ジェネリック型を返すことができるカスタム マークアップ拡張を定義することや、ジェネリック型から派生していても、独自のクラス定義でジェネリック制約がフラット化されているラップ クラス定義を提供することなどがあります。

WPF では XAML 2009 の機能を x:TypeArguments と共に使用できますが、Loose XAML (マークアップ コンパイルされていない XAML) に限定されます。 WPF 向けにマークアップ コンパイルされた XAML、および XAML の BAML 形式は、現在、XAML 2009 のキーワードと機能をサポートしていません。

.NET Framework 3.5 用の Windows Workflow Foundation でのカスタム ワークフローでは、ジェネリック XAML の使用はサポートされていません。

関連項目