wpf - 将其放在代码隐藏或 ViewModel 中

标签 wpf mvvm

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

不到一年前我刚开始工作时,办公室的想法是尽可能不使用代码隐藏代码,也不查看 VM 中的特定代码。所以,我绞尽脑汁想确定如何从字面上插入一切进入虚拟机并保留我认为从虚拟机中查看特定代码的内容,但几乎每次都会出现短缺。我现在说到点子上了,我开始认为代码隐藏并不总是坏的或“错误的”。我最近一直在尝试通过将任何代码隐藏推送到 VM 中来清理我们的一些观点,这导致我在 http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html 找到了一个整洁的工厂类。 .这允许您将路由事件绑定(bind)到 ICommand s 在虚拟机中。它就像一个魅力,我能够用它显着减少我们的一些代码隐藏。然而,在这样做之后,我现在质疑我这样做的决定。我的方法遵循代码隐藏是坏/错误的理念,除非绝对需要。现在我已经有一点时间考虑了,我不太确定重构是不是最好的主意。

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

我担心的是,如果我们希望将来有不同的观点,而新观点不想以这种方式处理不匹配的 SSN,该怎么办。也许新 View 将允许用户输入不匹配的 SSN,然后在单击“确定”按钮时显示错误消息。新 View 是否必须接受 View 模型中为文本框中的每次按键而执行的额外代码开销?这对我来说听起来不对。我开始认为 View 模型应该包含支持 View 所需的内容,而不是为 View 做所有事情。 View 应该能够根据 View 模型中的某些内容做出决策,而不是依赖虚拟机来握住它的手——对吧?

最佳答案

XAML 和匹配的 .cs 文件构成了 View 。因此,只要将代码用于 View 本身,将代码放入代码隐藏中就没有错。

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

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

  • 将两个 SSN 字段绑定(bind)到 View 模型上的属性
  • 将 OK 按钮绑定(bind)到 View 模型中的命令(我是 Delegate Command 概念的忠实粉丝)
  • 该命令应实现 CanExecute 部分,并且仅在两个 SSN 匹配时才返回 true。

  • SSN 匹配似乎不是一个 View 问题,而是一种商业惯例。它属于 View 模型。 View 中的内容是您的应用程序如何显示 SSN 匹配或不匹配。

    关于wpf - 将其放在代码隐藏或 ViewModel 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4128645/

    相关文章:

    wpf - 删除列表框周围的多余空间

    c# - MVVM (WPF) 中的命令——如何返回 bool 值?

    c# - 获取 View 模型中的选定选项卡(wpf)

    wpf - 将实现与模式的某些部分匹配

    c# - MVVM View 模型引用 View

    wpf mvvm 自定义控件 - 在控件上调用操作

    c# - 将一个按钮绑定(bind)到 3 个不同的 DataGrids,每个 DataGrids 在 TabControl 中

    windows-phone-7 - 使用 MVVM 从 ListBox 中删除项目

    c# - 从线程MVVM更新进度栏

    c# - 转换为值类型 'int32' 失败,因为具体化值为 null