在MVVM模式中,我们可以看到View和ViewModel相对独立出来,这就引发了View与ViewModel及ViewModel见的通信,以本人看来,目前View和ViewModel见通过数据的绑定实现简单通信,一个View能够找到它所需要的ViewModel,绑定可以实现单向和双向的数据通信,而ViewModel间的通信又如何来实现呢?
简单来说如果有个View叫va,对应的存在一个viewmodel叫vma,还有一个view叫vb,对应的viewmodel叫vmb,如果我们在va中一个属性的变化,我们想让vb中也能有所变化,就好比va将变化通知vb,希望vb对变化进行处理。这时我们以前的做法可能是由va向vb传递一个参数,并触发或调用vb中一个公开的方法。那么在MVVM中由于View间相对对立更多的业务逻辑有Viewmodel来完成,这就意味着View间通信实际有VM来完成,但是一个vm有可能有多个view应用,又如何让Va的变化只反映到VB中呢?所以我认为这就是我要选择MVVM light tookkit 中的Messager了。
Messager能为我们做什么?
在刚开始学Messager时总以为他是一个消息框而已,类似Messagebox,但学习以后才发现错了。简单说Messager是为我们提供了消息的发生和接收,消息发送可以指定消息对象也可采用广播即只要注册同意接收我的消息的实例都会收到广播信息。另外在信息接收方可以注册需要接收的信息并指定收到信息后需要处理的方法。说到这里大致了解了Messager的核心意图了。
如何实现?
在E站看了一个实例,简单说下实现过程
示例:首先在ViewModelLocator中添加两个静态ViewModel属性,保障每个ViewModel只有一个实例。
1、在mainpage中添加一个属性,将该属性变化将会广播到发生信息
2、在第二个ViewModel中接收消息
问题思考
1、Messager确实实现了我们View及ViewModel的通信,但发现通信中的ViewModel一定是实现实例化的,这样才能及时接收到信息并处理,所以才会在ViewModelLocator中定义若干个ViewModel的静态实例对象,如果是小应用倒也没什么,但如果一个大一些的项目如何管理这些对象一定是个问题,难道要用传说中的Prism实现依赖注入?
2、上面也提到View间的通信其实是由ViewModel来完成,这就带来了ViewModel的设计的复杂程度,不但要做好自身对有可能的多个View的抽象处理,还要负责对相关联的ViewModel的通信处理。
哎,越学越觉得自己无知!高手们欢迎来我这里指点指点啊!!!