WPF UserControl上的依赖注入(Windsor)

时间:2011-03-29 20:16:53

标签: wpf dependency-injection castle-windsor

在MainView中使用DI不是问题: 我将窗户添加到我的容器中,并在启动时显示已从容器中取出的窗户。但是,如果我将一个usercontrol添加到我的主视图中作为xaml标记,wpf视图引擎将自动创建它的新实例,而不会拉出我添加到我的容器中的UserControl ..如何强制WPF视图引擎搜索组件view / xamal需要进入我的容器而不是创建新容器吗?

2 个答案:

答案 0 :(得分:2)

如果不修改XAML,就无法做到这一点。您可以考虑一些变通方法,例如创建一个继承自ContentControl的控件,它会将依赖项注入其Content,但我不推荐这种方法,只有您别无选择。

我建议使用最好的WPF模式 - MVVM 。我们的想法是拥有ViewModel的层次结构,所有这些都将使用具有适当构造函数注入的IoC容器创建。您还将拥有视图层次结构,每个视图将仅依赖于相应的viewModel,该视图将传递到视图的DataContext。这种方法可以很好地在WPF应用程序中使用DI。

答案 1 :(得分:2)

我想我理解你的建议

<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>

在启动时将MainWindow从容器中拉出来

protected override void OnStartup(StartupEventArgs e)
{
    GuyWire.Wire();
    ((Window)GuyWire.GetRoot()).Show();//MainWindow
}

和Mainwindow看起来像

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; }
}