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

我正在阅读我的一些旧代码,并遇到了一个混合的IValueConverter / 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? } 

如果你的MarkupExtension在没有与IServiceProvider进行任何交互的情况下工作,那么显然没有任何东西可以从访问它。 我自己看过和写过的所有MarkupExtension / ValueConverter组合也属于这一类。

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

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

 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; // ... }