代码之家  ›  专栏  ›  技术社区  ›  ihatemash

把它放在codebehind或viewModel中

  •  4
  • ihatemash  · 技术社区  · 15 年前

    我想知道什么时候/如果可以将代码放在codebehind中的话。我只在这里呆了不到一年。所以,我仍然认为自己很“绿色”。我来自德尔福。所以,学习曲线是巨大的,至少可以说学习wpf、xaml、c、unity、prism、mef、.net、mvvm等很有趣但很有挑战性。

    当我不到一年前刚开始工作时,办公室里的想法是:如果可能的话,没有代码隐藏,在虚拟机中也没有视图特定的代码。所以,我已经绞尽脑汁想了很多次了,想知道如何把所有的东西都推到虚拟机中,并把我认为是视图特定代码的东西从虚拟机中保留出来,但几乎每次都是这样。我到现在为止,我开始认为codebehind并不总是坏的或者错误的。我最近一直试图通过将任何代码隐藏到VM中来清理我们的一些视图,这导致我在中找到了一个整洁的工厂类。 http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html . 这允许您将路由事件绑定到 ICommand 在虚拟机中。它就像一个魅力,我能够大大减少我们的代码背后的一些。但是,这样做之后,我现在质疑我这样做的决定。我的方法遵循这样的理念:除非绝对需要,否则代码隐藏是坏的/错误的。现在我有点时间考虑一下,我不太确定重构是最好的主意。

    下面是我重构的视图的一个示例。我们有一个新的帐户视图,用户在其中输入一个SSN,在创建新帐户之前必须重新输入SSN。该视图有一个标签,显示文本,告诉用户ssn和rekey ssn是否不匹配,并且在两者匹配之前,不会启用OK按钮。一旦ssn和rekey ssn匹配,标签就会消失(是的,我知道我讨厌这个,但我只是开发者),并且OK按钮被启用。因此,隐藏/显示标签和启用/禁用OK按钮是由 TextChanged SSN和Rekey SSN文本框中的事件。最初,我在codebehind中有逻辑来比较两个文本框值,并适当地设置viewModel属性以更新标签的可见属性和OK按钮的启用属性(是的,它们的属性在XAML中绑定)。找到这个新的工厂类后,我使用它将所有代码推送到ViewModel中,视图的工作方式与以前一样,只是没有codebehind。在成功地重构视图之后,我现在再次猜测重构的决定。

    我担心的是,如果我们希望在未来有一个不同的视图,而新的视图不希望以这种方式处理不匹配的ssn,会怎么样?也许新视图允许用户输入不匹配的ssn,然后在单击OK按钮时显示错误消息。新视图是否必须接受ViewModel中为文本框中的每个按键执行的额外代码开销?我听上去不太对劲。我开始认为视图模型应该包含支持视图所需的内容,但不能为视图做任何事情。视图应该能够基于视图模型中的某个内容做出决策,而不是依赖于虚拟机来控制它的右手?

    1 回复  |  直到 13 年前
        1
  •  5
  •   Nathan    15 年前

    XAML和匹配的.cs文件构成了视图。因此,只要将代码放在视图本身的代码后面,就没有什么错。

    代码隐藏肯定没有什么“错误”。

    下面是我如何处理您的SSN示例:

    1. 将两个SSN字段绑定到视图模型上的属性
    2. 将OK按钮绑定到视图模型中的命令(我是委托命令概念的忠实粉丝)
    3. 命令应该实现canexecute部分,并且只在两个ssn匹配时返回true。

    SSN匹配似乎不是一个视图问题,而是一种业务实践。它属于视图模型。视图中的内容是您的应用程序 显示 SSN是否匹配。