.xaml.cs 和 ViewModels/ViewModel.cs 有什么区别?

What is the difference between .xaml.cs and ViewModels/ViewModel.cs?

我一直在关注使用 Caliburn micro 的 MVVM 模式教程

https://www.youtube.com/watch?v=laPFq3Fhs8k

.xaml.cs 和 ViewModels/ViewModel.cs 有什么区别?

我看到我们将 shellview 的代码放在 ShellViewModel.cs 中,但是当我为按钮选择事件处理程序时,visual studio 将我带到 .xaml.cs而不是 ViewModels/ViewModel.

我是否必须坚持一个或每个文件都有不同的 role/responsibility? (考虑到我希望我的代码仍然遵循 MVVM 模式)

.xaml.cs 结尾的文件就是所谓的视图的 "code-behind"。此文件中的任何内容都与视图紧密耦合。

如果您想遵循 MVVM 模式,您将编写几乎所有 UI 与模型的交互(例如:单击按钮更改一些数据或从数据库中获取一些数据)在独立于视图的 ViewModels (.cs files) 上。

View 和 ViewModel 之间唯一的 link 是 ViewModel 是 View 的 DataContext。换句话说,View 知道 ViewModel,但 ViewModel 对 View 一无所知。

事件处理程序通常不用于 MVVM 世界。您需要使用命令。但那是完全不同的 question/answer.

要记住的重要一点是,MVVM 主要解决两件事:关注点分离(UI vs UI 逻辑)和软件的可测试性。

首先,我建议您先了解所用 UI 框架(WPF 等)的基础知识,然后再在其上添加其他框架。我已经看到这只会让学习曲线变得更陡峭。

话虽如此,.xaml.cs 文件就是通常所说的 代码隐藏 。这是 "controls" 的代码,可以说是 UI。例如,您会注意到,这些都是 "partial" class,因为编译时会自动生成一些代码,这些代码会执行特定于视图的操作,例如绑定等。应谨慎使用 xaml.cs 文件,仅当您需要了解或操作视图本身的细节时才使用。

使用 MVVM,您经常会看到 classes 后面的代码几乎完全是空的,只有一个构造函数。这些情况下的逻辑被移动到 "View Model" class,它在视图和模型之间提供了 link(查看 this SO post 以获得更详尽的描述)。 您应该绑定到视图模型中的对象,并将其用作视图的数据上下文。它包含定义视图如何影响模型的所有逻辑。

因此 - 将此应用到事件处理程序...事件必须存在于代码隐藏中,因为您无法显式绑定到 VM 中的事件。您可以通过访问该事件处理程序内部的 ViewModel 轻松地调用您想要的函数,并且这种方法没有什么特别过分的地方。也就是说,还有另一个概念称为命令,它将存在于视图模型本身中;与事件处理程序相反,命令是 属性,因此您可以使用

绑定到 .xaml 文件中的命令
...Command="{Binding FunctionNameHere}"...

它还有一些不错的功能,例如能够定义命令何时有效(因此您可以在例如表单缺少必填字段时自动禁用按钮)。