wpf sliverlight mvvm

如果你是一名正在使用MVVM 模式打造软件的程序员, 那么我劝你尽快忘掉View.
你所面对的是这样一个模式"UnitTest-ViewModel-Model"(这并非一个模式, 仅
仅是我为阐述观点而暂时如此表述的)。

记得曾经有一个Model-View-AbstractView 模式, 而MVVM 中的VM 实际也是一个
AbstractView: the abstraction of view. 它是一个抽象的 View, 具有一个
View 的灵魂,而不具备相应的可视化控件而已. 所以对于程序员而已, 打造这
样一个抽象的 VM 就可以认为是完成 View 层的打造了.而当美工完成无数控件组
成的实际的 View 后, 我们就可以用 Binding 和 Command 这样的黏合剂将这个抽
象的 View 和实际的 View 黏合在一起了。

那么在黏合之前, 我们怎么知道自己的 VM 是否正常工作呢? 单元测试!

在说明对于 ViewModel 进行单元测试的重要性之前, 送给大家一句话: "View
and Unit Test are just two different types of ViewModel consumers" (Josh
Smith). 如果我们将 ViewModel 看作生产者, 那么 View 和 Unit Test 都是具有
同等地位的消费者而已. 并且 UnitTest 相比于 View 而言具备更大的消费能力.
或者你可以简单的认为 View 也仅仅是一种不太推荐的测试方式而已. 所以要实
施好这个模式, 那么对 ViewModel 的单元测试就是必须的了,并且这个测试要不
依赖于任何UI 控件. (那么不是不对应 ViewModel 的开发是不是就应该通过测试
来驱动了?TDD?)

4, AttachBehavior

一般情况下利用 Command, Binding, AttachProperty 等 WPF 特性, View 和
ViewModel之间能配合工作得很好.  假设我们有一个Button, 当该Button被点
击的时候我们要完成一些操作, 很简单, 将该操作封装成一个 Command 并绑定
到该 Button 上就可以了, 但如果我们要在 Button 被 Load 的时候执行另外一些
操作呢?      由于Button 没有直接被 Load 事件所触发的 Command, 所以不能使用
Command 了. 不能直接将 Load 事件处理器写在 Button 所在的 Xaml 所对应的 CS
文件里, 这和我们刚才对 MVVM 的设计是相矛盾的. 一个不太好的方案是继承一
下 Button, 并撰写一个由 Load 所触发的 Command, 这可行, 但明显不好. 正如
一个控件没有某个属性并且在不继承的情况下而采用 AttachProperty 一样, 我
们可以采用 AttachBehavior. AttachBehavior 不是 WPF 特性, 它仅仅是一个最
佳实践, 一个 Pattern. 关于 AttachBehavior 语法如何书写, 请参考 :
http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx

你可能感兴趣的:(wpf sliverlight mvvm)