【问题标题】:MarkupExtension.ProvideValue -- Is the IServiceProvider actually used?MarkupExtension.ProvideValue -- 是否实际使用了 IServiceProvider?
【发布时间】:2011-11-17 10:05:14
【问题描述】:

我正在浏览我的一些旧代码,遇到了一个混合的 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?
}

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      例子

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 2015-01-03
        • 2014-09-28
        • 1970-01-01
        相关资源
        最近更新 更多