【发布时间】:2018-12-13 09:00:31
【问题描述】:
我在 WPF 应用程序上执行 Ninject - 依赖注入时遇到了一些问题。
我已经成功地为我的 MainView.xaml 和 MainViewModel.cs 进行了正确的依赖注入,我通过在我的 App.xaml.cs 中设置数据上下文来做到这一点。有了这个,我将我的 MainWindow 数据文本设置为内核从 ninject 检索到的视图模型。
这是我的 App.xaml.cs,我在 app.xaml 中将其设置为 Startup 而不是 StartupUri
private void Application_Startup(object sender, StartupEventArgs e)
{
var kernel = new StandardKernel(new CompositionModule());
MainWindow mainWindow = new MainWindow();
mainWindow.DataContext = kernel.Get<MainViewModel>();
mainWindow.Show();
}
到目前为止,它非常适合 MainViewModel,但我的问题是我的 MainViewModel 有多个子视图模型。
这是我的子视图模型的示例,我的 MainView.xaml 看起来像 - 从下面你可以看到我的 MainView.xaml 将主窗口分成两部分。主窗口的一部分显示view1 和viewmodel1,另一部分显示view2 和viewmodel2。两者都在同一个窗口中,我这样做只是为了更容易显示这些部分的作用。我的问题是,现在我正在绑定 Content = Viewmodel1,但是当我尝试将参数值放入构造函数时,我的应用程序不会执行构造函数代码。它只是跳过它。我的子视图模型属于部分类,它由 viewmodel1.cs 和 viewmodel.commands.cs 组成。 viewmodel.commands 部分仅包含 GUI 的命令。 ContentTemplate 是我的 xaml 资源中的数据模板 - app.xaml 中加载的资源字典文件。
<telerik:RadSplitContainer Orientation="Vertical" telerik:DockingPanel.InitialSize="750,200">
<telerik:RadPaneGroup IsContentPreserved="False" telerik:ProportionalStackPanel.RelativeSize="200,300" >
<telerik:RadPane Header="{Binding ViewModel1.Title, Mode=TwoWay}"
CanUserClose="False" CanUserPin="False"
CanDockInDocumentHost="True">
<ContentControl ContentTemplate="{StaticResource View1Template}"
Content="{Binding Viewmodel1}" />
</telerik:RadPane>
</telerik:RadPaneGroup>
<telerik:RadPaneGroup IsContentPreserved="False" telerik:ProportionalStackPanel.RelativeSize="100,120">
<telerik:RadPane Header="ViewModel2.Tile"
CanUserClose="False" CanUserPin="False"
CanDockInDocumentHost="True">
<ContentControl ContentTemplate="{StaticResource View2Template}"
Content="{Binding Viewmodel2}" />
</telerik:RadPane>
</telerik:RadPaneGroup>
</telerik:RadSplitContainer>
这两个视图模型绑定到 MainView.xaml 中的内容。
public ViewModel1 ViewModel1 { get; set; } = new ViewModel1();
public ViewModel2 ViewModel2 { get; set; } = new ViewModel2();
如何使依赖注入也适用于我的子视图模型?似乎它不起作用的原因是因为每当我将接口作为构造函数参数时,构造函数都不会被执行。
感谢我能得到的任何帮助。它适用于 MainViewModel,但不适用于我的资源文件和其他视图模型。
【问题讨论】: