MarkupExtension.ProvideValue - 是否实际使用了IServiceProvider?

时间:2011-09-14 22:01:03

标签: c# wpf ivalueconverter markup-extensions service-provider

我正在查看我的一些旧代码并遇到了混合IValueConverter / MarkupExtension类。它让我想知道IServiceProvider方法中的ProvideValue是否真的有用,以及它如何有用?

我看到IServiceProvider只有一个方法:GetService,必须转换为正确的服务类型。我还查看了MarkupExtension.ProvideValue MSDN页面,它列出了不同类型的服务。我想,我只是想知道这些服务是否有用,或者我应该保留我的方法呢?

当前方法:

public Object ProvideValue(IServiceProvider serviceProvider)
{
    return new MyConverter();
}

基本上,我应该做以下事情:

public Object ProvideValue(IServiceProvider serviceProvider)
{
    var provider = serviceProvider as SomeType;

    if (provider == null) return new MyConverter();

    //Do something with the provider here?
}

2 个答案:

答案 0 :(得分:11)

提供程序可用于获取有关其应用于的目标对象和属性的信息。如果您不需要知道这些值,那么您不需要使用它

实施例

public override object ProvideValue(IServiceProvider provider)
{
    IProvideValueTarget service = (IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget));
    DependencyObject targetObject = service.TargetObject as DependencyObject;
    DependencyProperty targetProperty = service.TargetProperty as DependencyProperty;

    // ...
}

答案 1 :(得分:6)

如果您的MarkupExtension无法与IServiceProvider进行任何互动,那么显然无法获取任何内容。我自己看过和写过的所有MarkupExtension / ValueConverter组合也属于这一类。

从实际问题开始,如果您只是在寻找阅读材料,那么有关提供商可以提供哪些服务以及它们如何有用的更多信息here