将它放在ViewModel后面的代码中

时间:2010-11-08 22:17:20

标签: wpf mvvm

我想就何时/是否可以将代码置于代码隐藏中获得一些意见。我现在只有不到一年的时间。所以,我仍然认为自己非常“绿色”。我来自德尔福背景。因此,学习曲线至少可以说 - 学习WPF,XAML,C#,Unity,Prism,MEF,.NET,MVVM等......有趣但非常具有挑战性。

当我第一次开始不到一年前,办公室的想法是没有代码隐藏的代码,如果可能的话,没有查看虚拟机中的特定代码..所以,我已经多次绞尽脑汁确定如何将所有内容推送到虚拟机中,并保持我认为特定于代码的特定代码,只是每次都很简短。我现在已经到了这一点,我开始认为代码隐藏并不总是坏或“错误”。我最近试图通过尝试将任何代码隐藏到VM中来清理我们的一些视图,这导致我在http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html找到一个整洁的工厂类。这允许您将路由事件绑定到VM中的ICommand。它就像一个魅力,我能够显着减少我们的一些代码隐藏。但是,在这样做之后,我现在质疑我这样做的决定。我的方法遵循的原则是,除非绝对需要,否则代码隐藏是错误/错误的。现在我有一点时间考虑它,我不太确定重构是最好的主意。

以下是我重构的视图的示例。我们有一个新的帐户视图,用户在该视图中输入SSN,并且必须在创建新帐户之前重新生成SSN。该视图有一个标签,显示文本以告知用户SSN和重定密钥SSN是否不匹配,并且在两者匹配之前未启用“确定”按钮。一旦SSN和重新密钥SSN匹配,标签就会消失(是的,我知道......我讨厌但我只是开发人员)并且启用了OK按钮。因此,标签的隐藏/显示以及OK按钮的启用/禁用是从SSN中的TextChanged事件和重定密钥SSN文本框中触发的。最初我在代码隐藏中有逻辑来比较两个文本框值并适当地设置viewmodel属性来更新标签的可见属性和OK按钮的启用属性(是的,它们的属性绑定在XAML中)。在找到这个新的工厂类之后,我用它将所有代码都推送到viewmodel中,并且视图的工作方式就像之前没有代码隐藏一样。在成功重构视图之后,我现在第二次猜测重构的决定。

我担心的是,如果我们希望将来有不同的观点,并且新观点不希望以这种方式处理不匹配的SSN,该怎么办?也许新视图将允许用户输入不匹配的SSN,然后在单击“确定”按钮时显示错误消息。新视图是否必须接受为文本框中的每个按键执行的viewmodel中的代码额外开销?这对我来说听起来不对。我开始认为viewmodel应该包含支持视图需要但不支持视图所需的内容。该视图应该能够根据视图模型中的某些内容做出决策,但不依赖于VM来保持其权利吗?

1 个答案:

答案 0 :(得分:5)

XAML和匹配的.cs文件组成了视图。因此,将代码放入代码隐藏中只要是视图本身就没有错。

代码隐藏当然没有“错误”。

以下是我处理您的SSN示例的方法:

  1. 将两个SSN字段绑定到视图模型上的属性
  2. 将OK按钮绑定到视图模型中的命令(我是Delegate Command概念的忠实粉丝)
  3. 该命令应实现CanExecute部分,并且只有在两个SSN匹配时才返回true。
  4. SSN匹配似乎不是一个视图问题,这是一种商业惯例。它属于视图模型。视图中的内容是您的应用程序如何显示 SSN是否匹配。