Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MarkupExtension.ProvideValue——是否实际使用IServiceProvider?_C#_Wpf_Ivalueconverter_Markup Extensions_Service Provider - Fatal编程技术网

C# MarkupExtension.ProvideValue——是否实际使用IServiceProvider?

C# MarkupExtension.ProvideValue——是否实际使用IServiceProvider?,c#,wpf,ivalueconverter,markup-extensions,service-provider,C#,Wpf,Ivalueconverter,Markup Extensions,Service Provider,我在浏览我的一些旧代码时,遇到了一个混合IValueConverter/MarkupExtension类。这让我想知道ProvideValue方法中的IServiceProvider是否真的有用,以及它如何有用 我看到,IServiceProvider只有一个方法:GetService,它必须转换为正确的服务类型。我还查看了MSDN页面,它列出了不同类型的服务。我想,我只是想知道这些服务是否有用,或者我应该保持我的方法不变吗 现行方法: public Object ProvideValue(IS

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

我看到,
IServiceProvider
只有一个方法:
GetService
,它必须转换为正确的服务类型。我还查看了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;

    // ...
}