型コンバーターおよびマークアップ拡張機能で使用できるサービス コンテキスト

型コンバーターとマークアップ拡張機能の使用をサポートする型の作成者には、マークアップまたは周辺のオブジェクト グラフ構造体のどこで使用されているかを示す文脈情報が必要です。 情報は、指定されるオブジェクトを正しくインスタンス化するため、またオブジェクト グラフ内の既存オブジェクトへのオブジェクト参照を行うために必要です。 .NET XAML サービスを使用している場合、必要となる可能性のあるコンテキストは一連のサービス インターフェイスとして公開されます。 型コンバーターまたはマークアップ拡張のサポート コードでは、 XamlObjectWriter または関連する型から渡される使用可能なサービス プロバイダー コンテキストを使用して、サービスを照会できます。 XAML スキーマ コンテキストは、このようなサービスを通じて直接使用できます。 このトピックでは、値コンバーター実装からサービス コンテキストにアクセスする方法を説明し、通常使用できるサービスとその役割の一覧を示します。

サービスの取得

値コンバーターの実装者は、通常、値コンバーターが適用される何らかの種類のコンテキストにアクセスする必要があります。 たとえば、アクティブな XAML スキーマ コンテキスト、XAML スキーマ コンテキストや XAML オブジェクト ライターが提供する型マッピング システムへのアクセスなどの情報が必要です。 マークアップ拡張機能または型コンバーターの実装で使用されるサービスは、各仮想メソッドのシグネチャの一部であるコンテキスト パラメーターを通じて伝達されます。 いずれの場合でも、コンテキストに IServiceProvider が実装されているので、 IServiceProvider.GetService を呼び出してサービスを要求することができます。

マークアップ拡張機能のサービス

MarkupExtension には、仮想メソッドが 1 つだけあります ( ProvideValue)。 入力パラメーター serviceProvider は、XAML プロセッサによってマークアップ拡張機能が呼び出されたときに、サービスが実装に伝達される方法を示します。 次の疑似コードは、マークアップ拡張機能の実装が ProvideValueでサービスを照会する方法を示します。

public override object ProvideValue(IServiceProvider serviceProvider)
{
    //...
    // Get the IXamlTypeResolver from the service provider
    if (serviceProvider == null)
    {
        throw new ArgumentNullException("serviceProvider");
    }
    IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
    if (xamlTypeResolver == null)
    {
        throw new ArgumentException("IXamlTypeResolver");
    }
    //...
}

型コンバーターのサービス

TypeConverter には、サービス コンテキストを使用し、XAML の使用をサポートする仮想メソッドが 4 つあります。 これらのメソッドは、それぞれ入力パラメーター context を渡します。 このパラメーターの型は ITypeDescriptorContextですが、そのインターフェイスは IServiceProviderを継承するため、型コンバーターの実装では GetService メソッドを使用できます。

次の疑似コードは、XAML の使用に対する型コンバーターの実装が、そのオーバーライドの 1 つ (このケースでは ConvertFrom) の中でサービスを照会する方法を示します。

public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
  CultureInfo cultureInfo,
  object source)
{
    IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
    if (rootProvider != null && source is String)
    {
        //return something, else ...
    }
    throw GetConvertFromException(source);
}

値シリアライザー サービス

値シリアライザーのコンテキストでは、 ValueSerializer クラスに固有のサービス プロバイダー型 IValueSerializerContextを使用します。 このコンテキストは、 ValueSerializer の 4 つの仮想メソッドのオーバーライドに渡されます。 サービスを取得するには、コンテキストから GetService を呼び出します。

XAML サービス プロバイダー コンテキストの使用

マークアップ拡張機能または型コンバーターで使用できる XAML サービスにアクセスするための GetService のサービス プロバイダーは、内部クラスとして実装されており、インターフェイスを通して、および関連コンテキストに渡されるという方法を通してのみ公開されます。 読み込みパスまたは保存パスの既定の .NET XAML サービス実装にある XAML 処理操作が、サービス コンテキストを必要とする関連マークアップ拡張機能または型コンバーター メソッドを呼び出すと、この内部オブジェクトが渡されます。 状況に応じて、システムのサービス コンテキストは MarkupExtensionContextTextSyntaxContextを提供しますが、これら両方のクラスの詳細は内部にあります。 これらのクラスとの対話は、 GetServiceを通してサービスを要求することに限定されます。

.NET XAML サービス コンテキストから使用できるサービス

.NET XAML サービスは、マークアップ拡張機能、型コンバーター、値シリアライザーに加え、その他の使用も可能なサービスを定義します。 この後のセクションでは、これらの各サービスについて説明し、実装でのサービスの使用方法についてガイダンスを提供します。

IServiceProvider

リファレンス ドキュメント: IServiceProvider

関連:IServiceProvider.GetService を呼び出すための、.NET でのサービス ベースのインフラストラクチャの基本的な操作。

ITypeDescriptorContext

リファレンス ドキュメント: ITypeDescriptorContext

IServiceProviderから派生します。 このクラスは TypeConverter の標準シグネチャのコンテキストを表します。 TypeConverter は、.NET Framework 1.0 の時点から存在していたクラスです。 つまり、XAML や、文字列値の型変換という XAML TypeConverter のシナリオが登場する前から使用されていました。 .NET XAML サービスのコンテキストでは、TypeConverter のメソッドは明示的に実装されます。 その明示的な実装の動作により、 ITypeDescriptorContext API が XAML の型システムまたは XAML からのオブジェクトの読み取りや書き込みに関連したものでないことが、呼び出し側に示されます。 ContainerInstance、および PropertyDescriptor では、一般に、.NET XAML サービス コンテキストから null が返されます。

IValueSerializerContext

リファレンス ドキュメント: IValueSerializerContext

ITypeDescriptorContext から派生します。これについても、XAML の型システムに不適切な影響を与えないようにするために、明示的な実装に依存します。 ValueSerializerの静的ルックアップ ヘルパー メソッドをサポートします。

IXamlTypeResolver

リファレンス ドキュメント: IXamlTypeResolver

定義元:System.Windows.Markup 名前空間、System.Xaml アセンブリ

関連: 読み込みパスのシナリオ、および XAML スキーマ コンテキストとの対話

サービス API:Resolve

XAML ライターがオブジェクト グラフに CLR オブジェクトを構築するときに必要な、XAML から CLR への型マッピングに影響を与えることができます。 Resolve は、XAML の型名 (XamlType.Name) に対応する、プレフィックス修飾されていることのある文字列を処理し、CLR の Typeを返します。 型の解決は、通常、XAML スキーマ コンテキストに大きく依存します。 XAML スキーマ コンテキストだけが、どのアセンブリが読み込まれているか、これらのアセンブリの中で、型を解決するためにアクセスできる、またはアクセスする必要があるものはどれかといった考慮事項を認識しています。

IUriContext

リファレンス ドキュメント: IUriContext

定義元:System.Windows.Markup 名前空間、System.Xaml アセンブリ

関連: URI または x:Uri 値であるメンバー値を処理する読み込みパスおよび保存パス。

サービス API:BaseUri

このサービスは、グローバルに使用できる URI ルート (存在する場合) を報告します。 URI ルートは、相対 URI を絶対 URI に解決する場合、またはその逆を行う場合に使用できます。 このシナリオは主に、特定のフレームワークによって、またはフレームワークでよく使用されるルート要素クラスの機能によって公開されるアプリケーション サービスに関連しています。 ベース URI は、XAML リーダーの設定として確立することができます。その後、XAML オブジェクト ライターに渡され、このサービスによってレポートされます。

IAmbientProvider

リファレンス ドキュメント: IAmbientProvider

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 型の参照の遅延または最適化を処理する読み込みパス。

サービス API:GetAllAmbientValues、その他 3 つ。

XAML におけるアンビエンスの概念は、型の特定のメンバーをアンビエントとしてマーク付けする手法です。 あるいは、型のインスタンスを保持するすべてのプロパティ値をアンビエント プロパティと見なす必要がある場合には、型をアンビエントにすることもできます。 XAML ノード ストリームの先にあるか、オブジェクト グラフの下位にあるマークアップ拡張機能または型コンバーターは、読み込み時にアンビエント プロパティまたは型インスタンスにアクセスしたり、保存時にアンビエント構造の情報を活用したりできます。 これにより、 IXamlTypeResolverx:Typeなど、その他のサービスの型解決に必要な修飾の程度が左右されます。 参照 AmbientPropertyValue.

IXamlSchemaContextProvider

リファレンス ドキュメント: IXamlSchemaContextProvider

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 読み込みパス、および XAML 型をバッキング型に解決する必要があるその他の操作。

サービス API:SchemaContext

遅延コンテンツを統合するには、同じスキーマ コンテキストを遅延領域に対しても適用する必要があるので、遅延読み込み操作には XAML スキーマ コンテキストが必要です。 XAML スキーマ コンテキストの役割の詳細については、「 XAML Services」を参照してください。

IRootObjectProvider

リファレンス ドキュメント: IRootObjectProvider

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 読み込みパス。

サービス API:RootObject

このサービスは、特定のフレームワークによって、またはフレームワークでよく使用されるルート要素クラスの機能によって公開されるアプリケーション サービスに関連しています。 ルート オブジェクトを取得する 1 つのシナリオは、分離コードとイベント接続をつなげることです。 たとえば、 x:Class の WPF 実装は、マークアップ コンパイルと、XAML マークアップの他の場所にあるイベント ハンドラー属性の関連付けにおいて使用されます。 マークアップ コンパイルの部分クラスで定義されたマークアップと分離コードのコネクション ポイントは、ルート要素です。

IXamlNamespaceResolver

リファレンス ドキュメント: IXamlNamespaceResolver

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 読み込みパス、保存パス。

サービス API:GetNamespace 、保存パスの場合は GetNamespacePrefixes

IXamlNamespaceResolver は、元の XAML マークアップで対応付けられたプレフィックスに基づく XAML 名前空間 ID/URI を返すことができるサービスです。

IProvideValueTarget

リファレンス ドキュメント: IProvideValueTarget

定義元:System.Windows.Markup 名前空間、System.Xaml アセンブリ

関連: 読み込みパス、保存パス。

サービス API:TargetObjectTargetProperty

型コンバーターまたはマークアップ拡張機能は、IProvideValueTarget を使用して、読み込み時に動作している場所に関するコンテキストを取得できます。 実装では、このコンテキストを使用して、特定の使用を無効にすることもできます。 たとえば、WPF では、 DynamicResourceExtensionなどの一部のマークアップ拡張機能内にロジックを保持しています。 そのロジックは、 TargetProperty を確認して、依存関係のあるプロパティ (または、その他の依存関係のないプロパティの短い一覧) を設定する場合にのみ拡張機能が使用されるようにできます。

IXamlNameResolver

リファレンス ドキュメント: IXamlNameResolver

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 読み込みパスのオブジェクト グラフ定義、 x:Namex:Referenceまたはフレームワーク固有の手法によって識別されるオブジェクトの解決。

サービス API:Resolve、前方参照を処理する場合などの高度なシナリオで使用されるその他の API。

.NET XAML サービスでの x:Reference 処理の実装は、このサービスに依存しています。 特定のフレームワークまたはそのフレームワークをサポートするツールは、このサービスを使用して、 x:Name の処理、または同等の (RuntimeNamePropertyAttribute 属性で指定された) プロパティの処理を行います。

IDestinationTypeProvider

リファレンス ドキュメント: IDestinationTypeProvider

定義元:System.Xaml 名前空間、System.Xaml アセンブリ

関連: 読み込みパスでの間接的な CLR 型情報の解決。

サービス API:GetDestinationType

詳細については、「IDestinationTypeProvider」を参照してください。

関連項目