6

我正在浏览我的一些旧代码,并遇到了一个混合IValueConverter/MarkupExtension类。这让我想知道IServiceProviderProvideValue方法是否真的有用,以及它将如何有用?

我看到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?
}
4

2 回答 2

16

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

例子

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;

    // ...
}
于 2011-09-14T22:36:45.220 回答
6

如果您的MarkupExtension作品不需要与the 进行任何交互,IServiceProvider那么显然访问它不会有任何收获。我自己看过和写的所有MarkupExtension/组合也属于这一类。ValueConverter

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

于 2011-09-14T22:07:22.207 回答