我想就何时/是否可以将代码置于代码隐藏中获得一些意见.我现在只有不到一年的时间.所以,我仍然认为自己非常"绿色".我来自德尔福背景.因此,学习曲线至少可以说 - 学习WPF,XAML,C#,Unity,Prism,MEF,.NET,MVVM等......有趣但非常具有挑战性.
当我刚开始不到一年的时候,办公室里的想法是代码隐藏的代码,如果可能的话,没有查看虚拟机中的特定代码.所以,我已经多次绞尽脑汁来确定如何推送字面上的一切进入虚拟机并保持我认为是从VM中查看特定代码只是为了几乎每次都出现短缺.我现在已经到了这一点,我开始认为代码隐藏并不总是坏或"错误".我最近试图通过尝试将任何代码隐藏到VM中来清理我们的一些视图,这导致我在http://blog.functionalfun.net/2008/09/hooking-up-commands-找到一个整洁的工厂类.to-events-in-wpf.html.这允许您将路由事件绑定到ICommand在VM中.它就像一个魅力,我能够显着减少我们的一些代码隐藏.但是,在这样做之后,我现在质疑我这样做的决定.我的方法遵循的原则是,除非绝对需要,否则代码隐藏是错误/错误的.现在我有一点时间考虑它,我不太确定重构是最好的主意.
以下是我重构的视图的示例.我们有一个新的帐户视图,用户在该视图中输入SSN,并且必须在创建新帐户之前重新生成SSN.该视图有一个标签,显示文本以告知用户SSN和重定密钥SSN是否不匹配,并且在两者匹配之前未启用"确定"按钮.一旦SSN和重新密钥SSN匹配,标签就会消失(是的,我知道......我讨厌但我只是开发人员)并且启用了OK按钮.因此,标签的隐藏/显示以及OK按钮的启用/禁用是从TextChangedSSN中的事件和重新生成SSN文本框.最初我在代码隐藏中有逻辑来比较两个文本框值并适当地设置viewmodel属性来更新标签的可见属性和OK按钮的启用属性(是的,它们的属性绑定在XAML中).在找到这个新的工厂类之后,我用它将所有代码都推送到viewmodel中,并且视图就像没有代码隐藏之前那样工作.在成功重构视图之后,我现在第二次猜测重构的决定.
我担心的是,如果我们希望将来有不同的观点,并且新观点不希望以这种方式处理不匹配的SSN,该怎么办?也许新视图将允许用户输入不匹配的SSN,然后在单击"确定"按钮时显示错误消息.新视图是否必须接受为文本框中的每个按键执行的viewmodel中的代码额外开销?这对我来说听起来不对.我开始认为viewmodel应该包含支持视图需要但不支持视图所需的内容.该视图应该能够根据视图模型中的某些内容做出决策,但不依赖于VM来保持其权利 - 对吗?
XAML和匹配的.cs文件组成了视图.因此,将代码置于代码隐藏中并没有任何问题,只要它是视图本身.
代码隐藏当然没有"错误".
以下是我处理您的SSN示例的方法:
SSN匹配似乎不是一个视图问题,它是一种商业惯例.它属于视图模型.视图中的内容是您的应用程序如何显示 SSN是否匹配.