1

任何人都可以澄清这些条款吗?
我发现它们非常模糊或依赖于上下文。

例如,我们有一个带有项目列表的 VM。选择不仅会影响按钮的可访问性(即命令可以执行),还会影响 VM 的行为:一个或多个项目需要同时编辑很重要。

第二个示例是创建新项目的过程。
在用户提供数据后,我们将项目添加到项目集合中,从而将其插入列表中并希望使其被选中并聚焦。现在我们通过为项目的虚拟机引入IsSelected和属性来做到这一点。IsFocused真正的工作是由视图通过绑定、附加属性和行为来完成的。

我们团队的一些成员坚持认为向 VM 添加此类属性(IsVisible、、an 等)会给 VM 带来 UI 逻辑,这不是一个好的做法,因为 UI 和表示逻辑是混合的IsSelectedIsFocused

对我来说,遵循模式很重要,但更重要的是不要重复自己。我更喜欢绑定和代码隐藏中的几行代码,而不需要将 DataContext 转换为具体的 VM 类型、调用 VM 的方法等等。

尽管如此,我不喜欢HolyWars,并且承认由于对这两个术语的误解以及将两者分开的标准,我可能是错的。

4

1 回答 1

3

我认为将表示逻辑放在 VM 中并在其上具有 IsEnabled 之类的属性很重要,因为这使其可测试。这也降低了视图的复杂性,从而减少了无法进行单元测试的代码量。

此外,我会对您的同事可能对为什么 VM 中的表示逻辑不是最佳实践的任何参考感兴趣。恕我直言,UI 是表示层的一部分,VM 的目的是为视图建模。因此,将表示逻辑放在这里似乎很自然。

附加编辑:

实现 MVVM 模式

视图的职责是定义用户在屏幕上看到的结构和外观。理想情况下,视图的代码隐藏只包含一个调用 InitializeComponent 方法的构造函数。在某些情况下,代码隐藏可能包含 UI 逻辑代码,这些代码实现了难以用可扩展应用程序标记语言 (XAML) 表达的视觉行为,例如复杂的动画,或者当代码需要直接操作视觉元素时视图的一部分。您不应将任何逻辑代码放在需要进行单元测试的视图中。通常,视图代码隐藏中的逻辑代码将通过 UI 自动化测试方法进行测试。

于 2013-02-01T09:23:17.897 回答