表示逻辑与UI逻辑

时间:2013-02-01 09:12:07

标签: wpf design-patterns mvvm presentation-layer

请有人澄清这些条款。
我发现它们非常模糊或依赖于上下文。

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

第二个例子是创建新项目的过程 在用户提供数据之后,我们将项目添加到项目集合中,从而将其插入列表中并希望将其选中并集中。现在我们通过为项目的VM引入IsSelectedIsFocused属性来实现此目的。真正的工作是通过视图通过绑定,附加属性和行为完成的。

我们团队的一些成员坚持认为向虚拟机添加此类属性(IsVisibleIsSelectedIsFocused等)会为虚拟机带来UI逻辑,这不是一个好消息练习因为UI和表示逻辑是混合的。

对我而言,以下模式是重要的,但更重要的是不要重复自己。我更喜欢代码隐藏中的绑定和几行而不将DataContext强制转换为具体的VM类型,调用VM的方法等等。

尽管如此,我不喜欢HolyWars,并承认由于误解了这两个术语以及彼此分离的标准,我可能会出错。

1 个答案:

答案 0 :(得分:2)

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

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

其他编辑:

来自Implementing the MVVM Pattern

  

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