Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
依赖于WPF用户控制的依赖注入(Windsor)_Wpf_Dependency Injection_Castle Windsor - Fatal编程技术网

依赖于WPF用户控制的依赖注入(Windsor)

依赖于WPF用户控制的依赖注入(Windsor),wpf,dependency-injection,castle-windsor,Wpf,Dependency Injection,Castle Windsor,在MainView中使用DI不是问题: 我将我的窗口添加到我的容器中,并在启动时显示已从容器中拉出的窗口。但是,如果我将usercontrol作为xaml标记添加到主视图中,wpf视图引擎将自动为其创建新实例,而无需拉出我添加到容器中的usercontrol。。如何强制WPF视图引擎在容器中搜索view/xamal所需的组件,而不是创建新的组件 如果不修改您的XAML,就没有办法做到这一点。您可以考虑一些解决方法,例如创建一个继承自ContentControl的控件,该控件将把依赖项注入其内容,

在MainView中使用DI不是问题:
我将我的窗口添加到我的容器中,并在启动时显示已从容器中拉出的窗口。但是,如果我将usercontrol作为xaml标记添加到主视图中,wpf视图引擎将自动为其创建新实例,而无需拉出我添加到容器中的usercontrol。。如何强制WPF视图引擎在容器中搜索view/xamal所需的组件,而不是创建新的组件

如果不修改您的XAML,就没有办法做到这一点。您可以考虑一些解决方法,例如创建一个继承自
ContentControl
的控件,该控件将把依赖项注入其
内容
,但我不推荐这种方法,除非您别无选择


我建议使用最好的WPF模式--MVVM。其思想是拥有一个ViewModels的层次结构,所有这些模型都将使用IoC容器和适当的构造函数注入来创建。此外,您将拥有视图的层次结构,每个视图将仅依赖于相应的viewModel,该viewModel将被传递到视图的
DataContext
。这种方法将允许您在WPF应用程序中很好地使用DI。

我想我理解了您的建议

<Window x:Class="DDDSample02.Wpf.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:presentation="clr-namespace:DDDSample02.Wpf.Views"
        Title="MainWindow" Height="384" Width="821">
    <Grid>
        <presentation:ProductsView DataContext="{Binding Path=ProductsPresenter}" />
    </Grid>
</Window>
主窗口看起来像

public partial class MainWindow : Window
{

    public MainWindow(DDDSample02.ViewModel.MainWindowPresenter presenter)
    {
        InitializeComponent();
        this.DataContext = presenter;
    }

}

public class MainWindowPresenter
{
    public MainWindowPresenter(ProductsPresenter productPresenter)
    {
        this.ProductsPresenter = productPresenter;
    }

    public ProductsPresenter ProductsPresenter { get; private set; }
}
重复:
public partial class MainWindow : Window
{

    public MainWindow(DDDSample02.ViewModel.MainWindowPresenter presenter)
    {
        InitializeComponent();
        this.DataContext = presenter;
    }

}

public class MainWindowPresenter
{
    public MainWindowPresenter(ProductsPresenter productPresenter)
    {
        this.ProductsPresenter = productPresenter;
    }

    public ProductsPresenter ProductsPresenter { get; private set; }
}