2011-09-14 46 views
5

我正在浏览我的一些旧代码,并且遇到了一个混合类IValueConverter/MarkupExtension类。它让我想知道ProvideValue方法中的IServiceProvider实际上是否有用,以及它如何有用?MarkupExtension.ProvideValue - IServiceProvider实际使用了吗?

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

回答

6

如果您MarkupExtension作品不neeeding与IServiceProvider任何交互则显然有什么可以访问它获得。全部MarkupExtension/ValueConverter组合我自己看过和写过的组合也属于这一类。

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

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; 

    // ... 
}