MarkupExtension.ProvideValue(IServiceProvider serviceProvide

本文关键字:serviceProvide IServiceProvider ProvideValue MarkupExtension | 更新日期: 2023-09-27 18:28:52

如果您编写自己的MarkupExtension,您可能会偶然发现IServiceProvider serviceProvider-参数在设计时与运行时不同。例如,您无法获得IRootObjectProvider。那么,有没有关于该参数对象实现哪个Interfaces的文档?有没有获得根对象的变通方法?

MarkupExtension.ProvideValue(IServiceProvider serviceProvide

编写一个小助手来查看可用的服务:

public class ServiceExtension : MarkupExtension
{
    public ServiceExtension()
    {
    }
    public ServiceExtension(Type serviceType)
    {
        ServiceType = serviceType;
    }
    [ConstructorArgument("serviceType")]
    public Type ServiceType { get; set; }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public object Service { get; set; }
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (ServiceType == null)
        {
            Service= "ServiceType == null";
            return this;
        }
        var service = serviceProvider.GetService(ServiceType);
        Service= service ?? "null";
        return this;
    }
}

<Style TargetType="{x:Type HeaderedContentControl}">
    <Setter Property="Header" Value="{Binding ServiceType}" />
    <Setter Property="Content" Value="{Binding Service}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type HeaderedContentControl}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="Col1" />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Margin="0,0,5,0"
                                      ContentSource="Header" />
                    <ContentPresenter Grid.Column="1" ContentSource="Content" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ItemsControl Grid.IsSharedSizeScope="True">
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNameProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNameResolver}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IProvideValueTarget}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IXamlTypeResolver}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IValueSerializerContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type componentModel:ITypeDescriptorContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IDestinationTypeProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlNamespaceResolver}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IXamlSchemaContextProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IRootObjectProvider}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type x:IUriContext}}" />
    <HeaderedContentControl DataContext="{local:Service {x:Type xaml:IAmbientProvider}}" />
</ItemsControl>

请查看以下链接将帮助您

http://msdn.microsoft.com/en-us/library/system.windows.markup.markupextension.providevalue.aspx

http://vimalck.wordpress.com/2013/06/22/markup-extensions-for-events-in-net-4-5-2/