WPF控件的MVVM模式

    一提及MVVM,就会说到它是从MVC发展而来、实现了逻辑与界面的分离,这固然不错,但这个不是重点、而真正的思想在于:业务逻辑的独立,专注于对业务逻辑的抽象。不受其他因素(比如界面)的干扰。
 
    MVVM分离了逻辑与界面,目的就是解放业务逻辑,分离是手段、独立才是目的。
 
    业务逻辑的独立和界面与逻辑的分离不是一回事吗?是一回事。但是思考问题的角度不一样,这有着现实的意义:在做设计时,要把注意力放到抽象我们的业务逻辑上,换句话说要放到ViewModel的设计上。如果把注意力放到了分离上,方向就出现了偏差。
 
    WPF在设计控件时就是以这个思想为指导的(我猜的),比如ToggleButton,只关注逻辑模型的设计,那就是我有两种状态可以互相切换(为了简单,不提三态)也就是IsChecked属性。至于这个按钮是什么样的并不关心。或说不受UI所干扰。这就是WPF控件与Win32和WinForm控件设计时的最大区别。ToggleButton就是ViewModel,它只关注业务逻辑;那么MVVM里的View是什么?当然是ControlTemplate,我们设计ControlTemplate时会用TemplateBinding绑定到控件的属性上,指定Command,这不正是MVVM模式吗。我们可以说WPF的控件就是采用了MVVM模式,或者说都是以业务逻辑独立、专注抽象业务逻辑的思想为指导的。
 
    刚接触控件模板时,会惊讶它大的灵活与强大,而这种好处正是拜逻辑独立的思想所赐。
 
    所以,在MVVM模式里,ViewModel是核心、是基石。View只是它的UI表现形式、甚至Model是可有可无的,Model只是ViewModel的数据格式。再一次提出:做设计时,要把注意力放到ViewModel的设计上。
 
    上面说了,专注抽象业务逻辑,不受界面的因素所干扰,乔丹说:凡事无绝对。在采用MVVM模式编程时,遇到的最大问题是,当ViewModel中的一个属性改变时,需要更新UI,而且是调用View中控件的方法才能实现,如果在ViewModel中调用这个方法就破坏MVVM模式,不调用又实现不了。
 
    解决问题的方案就是AttachBehavior,参考:http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx 
    李宁说了:一切皆有可能。
posted @ 2009-07-25 15:25  吾爱孟夫子  阅读(5713)  评论(5编辑  收藏  举报