目前有很多关于MVVM设计模式的变体,但据我了解,视图允许依赖于视图模型。我的一位同事持不同意见,但他无法提供令人满意的解释。
例如,我的视图包含对其视图模型的引用。这并非所有视图都需要,但在向视图模型传递某些无法使用ICommand执行的事件时,它会有所帮助。
是否可以存在这种依赖关系?有哪些缺点?
目前有很多关于MVVM设计模式的变体,但据我了解,视图允许依赖于视图模型。我的一位同事持不同意见,但他无法提供令人满意的解释。
例如,我的视图包含对其视图模型的引用。这并非所有视图都需要,但在向视图模型传递某些无法使用ICommand执行的事件时,它会有所帮助。
是否可以存在这种依赖关系?有哪些缺点?
public MyViewModel ViewModel
{
get { return DataContext as MyViewModel; }
}
private void _someEventHandler(object sender, EventArgs )
{
ViewModel.SomeMethod();
}
在视图模型中持有对视图的引用需要注意。如果VM依赖于特定的视图实现,它将与视图紧密耦合,因此很难进行测试。
如果VM需要以某种方式与视图交互,则可以将要求抽象为接口,并让视图实现该接口。然后,当视图加载时,它可以提供一个对自身的引用给VM,VM可以使用该引用与视图进行交互。
仅通过数据绑定进行耦合确实很好,但有时视图需要从视图模型中获取更多的命令和属性。我有一个视图需要响应视图模型中的事件,而这些事件不能是路由事件。因此,这个视图需要引用它的视图模型。
我认为让视图尝试将其DataContext(通常在DataContextChanged事件内部)转换为正确的接口类型是一个好主意。这样,视图仍然可以通过数据模板和其他XAML进行初始化。如果你强制在构造函数中传递接口,你就必须在代码中创建视图。