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

时间:2017-12-18 10:36:31

标签: c# wpf xaml prism prism-6

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

我无法进行构造函数注入,因为这些用户控件直接在xaml中使用,所以我尝试访问ServiceLocator.Current但它引发了异常。

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

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

1 个答案:

答案 0 :(得分: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;
    }
}