Dependency injection 使用Unity将VM注入WPF中的自定义控件

Dependency injection 使用Unity将VM注入WPF中的自定义控件,dependency-injection,binding,custom-controls,unity-container,Dependency Injection,Binding,Custom Controls,Unity Container,我正在构建一个基于WPF的应用程序。我使用Unity在我的应用程序中注入所有不同的依赖项(在App.xaml.cs中定义)。 在我的主应用程序窗口中,我有一个非常复杂的自定义控件,该控件派生自控件(is中集成了大约10个控件)。 我希望在不将VM耦合到应用程序中的任何其他对象的情况下将VM注入此自定义控件(当然除了App.xaml.cs) 在我的应用程序中,对任何WPF窗口的注入都能很好地工作,但当我尝试注入自定义控件时,我面临着不同的情况: 1.以防我使用 container.Register

我正在构建一个基于WPF的应用程序。我使用Unity在我的应用程序中注入所有不同的依赖项(在App.xaml.cs中定义)。 在我的主应用程序窗口中,我有一个非常复杂的自定义控件,该控件派生自控件(is中集成了大约10个控件)。 我希望在不将VM耦合到应用程序中的任何其他对象的情况下将VM注入此自定义控件(当然除了App.xaml.cs)

在我的应用程序中,对任何WPF窗口的注入都能很好地工作,但当我尝试注入自定义控件时,我面临着不同的情况: 1.以防我使用 container.RegisterInstance(container.Resolve)

DI创建MyCustomControl的虚拟实例并注入VM(使用[Dependency]属性)。但是,当我在XAML中使用此特定实例时,不会使用它:

在这种情况下,它会初始化一个新的MyCustomControl,忽略任何依赖项

  • 以防我使用 container.RegisterType() MyCustomControl完全忽略注入


    我意识到我可能做错了什么(不仅仅是技术上的),我真的在努力避免耦合此控件(这显然会解决问题)。

    我不知道这是否是最佳解决方案,在寻找其他选项时发现了您的问题,但是,唉,这是我至少用于启动和运行的方法

    我创建了一个基本的UnityControl类,它是Control的子类。在构造函数中,我使用ServiceLocator获取对容器的引用。然后调用build方法来解析派生控件类上的任何依赖项。任何依赖项都实现为用DependencyAttribute标记的读/写属性

    以下是UnityControl的外观:

    public abstract class UnityControl : Control
    {
        protected UnityControl() : base()
        {
            Container = ServiceLocator.Current.GetInstance<IUnityContainer>();
            Container.BuildUp(this.GetType(), this);
        }
    
        protected IUnityContainer Container { get; private set; }
    }
    
    公共抽象类UnityControl:Control
    {
    受保护的UnityControl():base()
    {
    Container=ServiceLocator.Current.GetInstance();
    Container.building(this.GetType(),this);
    }
    受保护的IUnityContainer容器{get;private set;}
    }