Prism WPF - 如何在UserControls或自定义控件中访问ServiceLocator

问题描述 投票:0回答:1

我有一些可重用的UserControls,在那些UserControls中,我想访问我在bootstrapper中注册的一些服务实例。

我不能做构造函数注入,因为这些用户控件直接在xaml中使用,所以我试图访问ServiceLocator.Current但它抛出了异常。

那么访问用户控件中的注册服务实例的最佳实践是什么,你无法进行构造函数注入,因为WPF希望无参数构造函数在xaml中加载它们。

(顺便说一下,我正在使用UnityBootstrapper)

c# wpf xaml prism prism-6
1个回答
0
投票

您可以创建一个DependencyProperty IUnityContainer,并在xaml中为您的控件提供一个实例:

<local:MyControl UnityContainer="{Binding Container}"/>

现在您可以在MyControl中访问它。这会吗?

我的团队喜欢使用静态引用容器,但我们只允许在转换器中使用它。在这种情况下,也许你也可以使用它:

<local:MyControl UnityContainer="{UnityContainer}"/>

这是您需要使此选项工作:

public static class MarkupExtensionHost
{
    public static IUnityContainer Container { get; set; }
}

public class UnityContainerExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return MarkupExtensionHost.Container;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.