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