View和ViewModel之间的MVVM依赖关系

时间:2009-04-23 10:51:42

标签: .net wpf design-patterns mvvm

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

E.g。我的视图包含对其视图模型的引用。所有视图都不需要这样做,但在将某些事件传递给viewmodel时无法通过ICommand完成,这有助于它。

是否可以拥有此依赖项?有什么缺点?

2 个答案:

答案 0 :(得分:7)

主要指标是:可以测试吗

视图绝对需要对视图模型的引用。如何获得展示自身所需的信息呢?通常只在视图的DataContext中使用视图模型就足够了,但这仍然构成依赖关系。如果没有DataContext中的虚拟机,视图将毫无用处。

有时您需要视图才能回拨VM。通常我只是在后面的代码中执行此操作:

public MyViewModel ViewModel
{
    get { return DataContext as MyViewModel; }
}

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

从视图模型中获取对视图的引用是您需要小心的地方。如果VM依赖于特定的视图实现,则它与视图紧密耦合,因此难以测试。

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

答案 1 :(得分:1)

单独通过数据绑定进行耦合非常好,但有时视图需要的不仅仅是视图模型中的命令和属性。我有一个视图需要响应视图模型中的事件,并且这些事件不能被路由事件。所以这个视图需要引用它的视图模型。

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