【发布时间】:2010-10-21 08:09:08
【问题描述】:
目前 MVVM 设计模式有很多变体,但据我了解,允许视图依赖于视图模型。我的一位同事不同意,但他无法提供令人满意的解释。
例如我的视图包含对其视图模型的引用。这不是所有视图都需要的,但它有助于将某些事件传达给无法通过 ICommand 完成的视图模型。
有这种依赖关系可以吗?有什么缺点?
【问题讨论】:
标签: .net wpf design-patterns mvvm
目前 MVVM 设计模式有很多变体,但据我了解,允许视图依赖于视图模型。我的一位同事不同意,但他无法提供令人满意的解释。
例如我的视图包含对其视图模型的引用。这不是所有视图都需要的,但它有助于将某些事件传达给无法通过 ICommand 完成的视图模型。
有这种依赖关系可以吗?有什么缺点?
【问题讨论】:
标签: .net wpf design-patterns mvvm
仅通过数据绑定进行耦合确实很好,但有时视图需要的不仅仅是来自视图模型的命令和属性。我有一个视图需要响应视图模型中的事件,而这些事件不能被路由事件。所以这个视图需要一个对其视图模型的引用。
我认为视图尝试将其 DataContext(通常在 DataContextChanged 事件内部)转换为正确的接口类型是一个好主意。这样,视图仍然可以通过数据模板和其他 XAML 进行初始化。如果强制在构造函数中传递接口,则必须在代码中创建视图。
【讨论】:
主要指标是:你能测试一下吗?
视图绝对需要对视图模型的引用。否则它将如何获得显示自身所需的信息?通常只在视图的DataContext 中有视图模型就足够了,但这仍然构成依赖关系。如果没有DataContext 中的VM,视图将毫无用处。
有时您需要视图来回调虚拟机。通常我只是在后面的代码中这样做:
public MyViewModel ViewModel
{
get { return DataContext as MyViewModel; }
}
private void _someEventHandler(object sender, EventArgs )
{
ViewModel.SomeMethod();
}
从视图模型中保存对视图的引用是您需要小心的地方。如果 VM 依赖于特定的视图实现,则它与视图紧密耦合,因此难以测试。
如果 VM 需要以某种方式与视图交互,您可以将需求抽象为一个接口并让视图实现该接口。然后,当视图加载时,它可以为 VM 提供对自身的引用,VM 可以与之交互。
【讨论】: