WPF 中的 MVVM

模型和视图模型

模型的定义经常引起激烈争论,模型和视图模型之间的界限可能会模糊不清。有些人不喜欢污染他们的模型与 INotifyPropertyChanged 接口,而是在视图模型,复制模型属性确实实现此接口。像软件开发中的许多东西一样,没有正确或错误的答案。务实,做任何正确的事情。

查看分离

MVVM 的目的是将这三个不同的区域分开 - 模型,视图模型和视图。虽然视图可以接受视图模型(VM)和(间接)模型,但 MVVM 最重要的规则是 VM 应该无权访问视图或其控件。VM 应通过公共属性公开视图所需的所有内容。VM 不应直接暴露或操作 UI 控件,如 TextBoxButton 等。

在某些情况下,这种严格的分离可能很难处理,特别是如果你需要启动并运行一些复杂的 UI 功能。在这里,在视图的代码隐藏文件中使用事件和事件处理程序是完全可以接受的。如果它纯粹是 UI 功能,那么无论如何都要利用视图中的事件。这些事件处理程序也可以在 VM 实例上调用公共方法 - 只是不要将它传递给 UI 控件或类似的东西。

RelayCommand

不幸的是,这个例子中使用的 RelayCommand 类不是 WPF 框架的一部分(应该是!),但几乎每个 WPF 开发人员的工具箱都会找到它。在线快速搜索将显示大量可以解除的代码片段,以创建自己的代码片段。

RelayCommand 的一个有用的替代品是 ActionCommand,它作为 Microsoft.Expression.Interactivity.Core 的一部分提供,提供相当的功能。