Return Value

When a XAML processor processes a type node and member value that is a markup extension, it invokes the ProvideValue method of that markup extension and writes the result into the object graph or serialization stream. The XAML object writer passes service context to each such implementation through the serviceProvider parameter.

See "Notes to Implementers" section for more information on how to implement ProvideValue in a custom markup extension.

Common services returned by the default service provider that is typically available to a custom or existing MarkupExtension implementation include the following primary services.

IProvideValueTarget reports the object reference and a property identifier from the context where the markup extension is used

IXamlTypeResolver exposes a service that parallels the general XAML object writing behavior that can provide a Type based on a XAML type name. The name can optionally include a prefix for a mapped XAML namespace.

IXamlSchemaContextProvider exposes the active XAML schema context directly. From the reported XamlSchemaContext, you can obtain XAML schema context information such as how assemblies are mapped for type support, preferred prefix in assemblies, lists of each XamlType in an assembly, and so on.

Other services available for more specialized markup extension scenarios include:

Potentially, implementations of ProvideValue can ignore the serviceProvider parameter. This is viable for some basic scenarios, where no context at all is required for returning a value.

In typical usage, the .NET Framework XAML Services and the implemented XAML object writers will provide a service provider to all value converter methods it invokes during XAML processing. However, for robustness, you should provide code paths for null values both for the service provider itself and for any requested service. Null values might occur if your markup extension is applied in some circumstance where the typical service support provided by a XAML parser infrastructure is not available.

Implementations that require a certain service to return a value are expected to throw exceptions if that service is not available. The recommended exception to throw is InvalidOperationException.

You may also throw exceptions if one of the arguments that your custom markup extension needs in order to provide a value is null, is invalid for its data type, or does not contain a value that your markup extension is capable of processing. The recommended exception to throw is InvalidOperationException.