我有一个简单的WPF应用程序,它使用Unity框架进行依赖注入。目前,我正在尝试简化我的MVVM模式实现中视图之间导航的方法;然而,Stack Overflow上的许多示例都没有考虑到依赖注入的注意事项。
我有两个完全分开的视图。
其中一个Main
作为主窗口,加载内容(非常典型;消除了不必要的内容):
<Window x:Class="Application.UI.Main">
<Grid Background="White">
<ContentControl Content="{Binding aProperty}"/>
</Grid>
</Window>
构造函数通过构造函数注入接收一个ViewModel(非常简单):
public partial class Main
{
private MainViewModel _mainViewModel;
public Main (MainViewModel mainViewModel)
{
InitializeComponent();
this.DataContext = _mainViewModel = mainViewModel;
}
}
我有一个UserControl
,名为Home
,我想要在主窗口中“导航”到它(即设置ContentControl
)。它的构造函数也通过构造函数注入接收ViewModel,就像Main
一样简单:
public Home(HomeViewModel homeViewModel)
{
InitializeComponent();
// Set Data Context:
this.DataContext = homeViewModel;
}
主要问题在于我想启用基于构造函数的注入,同时尽可能保持纯净的MVVM实现。
我属于MVVM中的View-first派别,在这些评论中,你可以找到对此进行讨论的良好资源。
我看到了一些关于基于导航的服务的暗示; 然而,我不确定它是否保持了MVVM所追求的关注点分离。
DataTemplates
需要不带参数的View构造函数,并且我已经阅读了有关DataTemplates的批评,认为ViewModels不应参与Views的实例化。
这个解决方案(依我之见)是完全错误的,因为ViewModel意识到了它的View,并依赖于一个服务来实例化ViewModel,这使得真正的依赖注入来解决ViewModel和View依赖关系变得几乎不可能。 在这个MSDN文章中,使用RelayCommand
时这个问题非常明显。
一个维护全局、类似单例的引用到 Main
视图的导航服务是最合理的吗?
Main
视图暴露一个方法,例如:
public void SetContent(UserControl userControl) { //... }
那么它是由该服务访问的吗?
Main
如何知道要显示哪个View呢?也就是说,依赖项必须存在。使用像Unity这样的框架,我无法从IoC中获取东西(我也不想这样做)。 - Thomas