将ViewModel置于代码后面是错误的吗?

时间:2013-12-11 09:56:16

标签: wpf xaml mvvm code-behind

在MVVM中,我们通常有一个View(XAML +通常是空代码隐藏)以及一个单独的ViewModel。 View和ViewModel之间的交互通过数据绑定进行。

假设View只是XAML并且其代码隐藏是空的(通常就是这种情况),使用代码隐藏本身作为ViewModel并将View绑定到代码隐藏的属性是否有任何问题?关注点的分离仍然存在 - 您有一个纯XAML视图和一个ViewModel,它是代码隐藏,它们只通过数据绑定相互通信。 ViewModel仍然可以进行单元测试。

这可能听起来像是异端邪说,但是当代码隐藏实际上是空的时候,我无法想到任何可以证明必须为ViewModel创建单独类的用例。

2 个答案:

答案 0 :(得分:5)

代码隐藏的定义是与视图关联的代码。在XAML中,这通常通过XAML根元素上的x:Class属性完成,继承自根元素的基本类型(这总是在自动生成的分部类文件中指定),依此类推。实际上a little section in the documentation概述了WPF XAML中代码隐藏的概念。由于x:Class属性只允许您指定一个类,因此这基本上将您的XAML标记绑定到一个类。该类代表其代码隐藏。

由于代码隐藏本质上是视图逻辑,或者基础代码用于 XAML标记,因此您无法将代码隐藏类视为模型。视图模型完全与视图无关,除了它们通过数据绑定向关联视图提供数据和从其关联视图接收数据的事实;另一方面,代码隐藏或UI逻辑主要涉及提供查看XAML表示的对象的行为,而不是应用程序逻辑。

就像其他人所说的那样,如果你能以某种方式使其工作,那么就编译器而言它并非“错误”,但我会说这有点违背了代码隐藏的本质。

答案 1 :(得分:3)

如果有效,则不是错误

然而,MVVM是一种模式,模式是有原因的。我们将视图模型放在不同的类中以强制执行MVVM的关键原则 - 关注点分离(SoC)。 SoC对您的开发有文化影响 - 您和您的团队不太可能让两者混淆。

与您问题中的陈述相反,您不允许分居。

以下是您的使用案例:通过将视图模型置于代码后面,您无法热交换用于表示视图模型的视图而您 会发现这种限制。

值得记住的是,所有模式都是工具。它们是一种手段,而不是目的,你不应该背弃它来使用它们。有摆动的空间,但在这种情况下,我觉得你摆得太远了。