WPF框架中的MVVM模式最难的部分主要集中于哪部分?

关注者
25
被浏览
30,672

9 个回答

这个问题问的太泛了,子曰:不奋不启,不悱不发。如果无法明确的细化问题,说明还没有到提问的时候。我根本不知道你提问的动机:比如是在学习过程中遇到了某个无法理解的部分?还是根本没开始学习,只想随便了解一下再决定要不要学?

那么,我这里也泛泛地答一下:所谓MVVM的难点,或者说设计模式的学习难点,都在于初学者没有遇到实际的问题,就直接开始学习“解决方案”(书本中举的例子往往太简单,很多都显得牵强)。这种感觉就好比一些不着边际的广告推销,强行给你推荐一个你根本用不到的产品,让你不知所措,被水淹没。

具体到WPF的MVVM,我这里提一点:逻辑代码与UI代码的分离问题。经常看到初学者的两种 错误 行为:

  • Winforms转来的开发者:所有业务逻辑都写到code behind里,也不能说没有ViewModel,他们直接给Control partial class实现INotifyPropertyChanged了,有些用Binding,有些挂Event Handler,看一会儿眼睛就瞎了;
  • 宗教主义者:所有逻辑都必须放到ViewModel里,单独建一个class;code behind一定要干干净净,只有一行InitializeComponent(),否则就是不清真。

其实,仔细一想就会发现,逻辑有两种:一是“业务逻辑”,二是“UI逻辑”。UI本身是有逻辑(behavior)的,比如点击ComboBox会弹出下拉框等;这些逻辑就应该放到code behind里,而不是ViewModel。但我们一般会用Costom Control,而不是User Control,然后挂一个默认样式,这样写控件就是纯写无外观的props和behavior。而User Control是一个简化版的Costom Control,区别就在外观与UI逻辑没有分离,不能随意替换外观,复用性略差,所以一般用作View,也就是用来组合那写可复用的Control,所以一般自己本身没有behavior,自然code behind一般也是空的。而Business Logic,才是需要放到ViewModel里的。当然,二者也有界线模糊的时候,这时就取决于你的工程经验了。

另外,就是基础的面向对象能力,设计对象、数据结构的能力。看过很多新手“思路清奇”的代码,发现其实都是面向对象基础没学好,这个是需要代码量来累积的。

我觉得是概念和写法,现如今各端包含js端有那么多mvvm框架甚至更进化的框架,但是每一个都是非常复杂的,远比以前写写事件来的复杂,绑定怎么写,数据怎么同步,怎么加过滤器加转换器怎么响应事件怎么广播消息,能不能vm套vm等,还有验证 动画 等

如今还有响应式,响应式在特殊逻辑下会比以前方便超级多,但是在很多普通场景并没有进步,但是他的入侵性很强

即便这类框架一通百通,但是写法又在不停的变化

说回wpf,如果学得早,那么和前端不同的地方就在于,学完以后一直用到现在都行,所以平均学习成本真的超级低。不像我,从jq ember knockout avalon ng1 到现在看着三大框架的最新版,哪个都懒得精通,还用着vue2,诶。