MVVM模式中视图和视图模型之间的依赖关系

3

目前有很多关于MVVM设计模式的变体,但据我了解,视图允许依赖于视图模型。我的一位同事持不同意见,但他无法提供令人满意的解释。

例如,我的视图包含对其视图模型的引用。这并非所有视图都需要,但在向视图模型传递某些无法使用ICommand执行的事件时,它会有所帮助。

是否可以存在这种依赖关系?有哪些缺点?

2个回答

9
主要指标是:您能否测试它?
视图绝对需要引用视图模型。否则,它如何获取所需信息以显示自身?通常,在视图的DataContext中仅具有视图模型就足够了,但这仍然构成了依赖关系。如果在DataContext中没有VM,则该视图将无用。
有时,您需要视图回调到VM。通常我会在我的代码后台执行此操作:
public MyViewModel ViewModel
{
    get { return DataContext as MyViewModel; }
}

private void _someEventHandler(object sender, EventArgs )
{
    ViewModel.SomeMethod();
}

在视图模型中持有对视图的引用需要注意。如果VM依赖于特定的视图实现,它将与视图紧密耦合,因此很难进行测试。

如果VM需要以某种方式与视图交互,则可以将要求抽象为接口,并让视图实现该接口。然后,当视图加载时,它可以提供一个对自身的引用给VM,VM可以使用该引用与视图进行交互。


1
而像Kent所建议的那样通过接口进行交流的原因是,您可以为测试模拟这个过程。您可以创建一个实现此接口的虚拟视图,以便进行测试。 - Josh G
但是如果视图引用了vm,那么视图也与视图模型紧密耦合。 - choxsword

1

仅通过数据绑定进行耦合确实很好,但有时视图需要从视图模型中获取更多的命令和属性。我有一个视图需要响应视图模型中的事件,而这些事件不能是路由事件。因此,这个视图需要引用它的视图模型。

我认为让视图尝试将其DataContext(通常在DataContextChanged事件内部)转换为正确的接口类型是一个好主意。这样,视图仍然可以通过数据模板和其他XAML进行初始化。如果你强制在构造函数中传递接口,你就必须在代码中创建视图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接