Fork me on GitHub

林德熙

If you have any language confusion,please talk to me lindexi_gd@163.com.

win10 uwp MVVM 轻量框架

如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题。如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文。如果因为ViewModel代码越来越多烦恼,请试试本文提供的框架。

本文介绍我做的框架,这是一个轻量的框架,可以同时使用其它的框架,用于多个页面之间,多个 ViewModel 之间的通信。

一般的通信是一个页面内存在多个子页面,而且经常需要对多个页面进行通信,为了降低多个页面的耦合度,于是我就做了自己的框架。这个框架比较简单,很多地方都抄袭了MVVMLight,所以是他的轻量版。

暂时我把框架放在 Nuget ,因为还没写文档,所以暂时不告诉大家地址啦。

多页面存在的问题

这里所说的页面包括用户控件,很多情况,可以使用用户控件代替页面。在存在一个页面创建之后,就不需要替换,那么使用用户控件也可以,但是页面的等级是比用户控件更高,所以在比较大的功能,建议使用页面。另一个是存在一个功能,需要替换多个页面,这时使用用户控件就不太好,建议使用页面。接下来,我将会分析两个情况来告诉大家。

第一个情况如上图的设计,左侧的选项页面就是在程序运行中不会改变的,即使改变,也只是某一些选项,所以这个左侧页面,就可以尝试使用用户控件,或者连用户控件也不要,直接写就可以了。

第二个情况就是上图功能页面,在点击不同的选项,显示不同的页面,那么这时建议使用的就是Frame和页面,因为这样比较容易导航。虽然使用用户控件同样可以做到,并且加上 DataTemplate 也可以做出来。

假如左侧的页面和功能页面是两个不同的页面,那么这两个页面如何进行通信?简单的方法是,直接使用 MianPage 传给左侧页面一个 Frame ,于是左侧页面就可以通过 Frame 进行跳转到需要显示的功能页面。看起来这是一个不错的方法,但是如果有一天,需要把功能页面修改为用户控件,那么这个动作就会很大。当然,程序员是最大的,所以不会修改,好吧,我相信了。那么如果存在另一个按钮,用于跳转到某个特定的功能页面,这时怎么办?

如果说,那就让他跳,反正我不关心,这时需要想一下,左侧页面,是否对当前显示的页面做出不同的颜色,如果功能页面修改了,如何知道?

所以多页面通信之间还是有坑的,最好让他们耦合降低,这样就不会出现修改时,准备拿刀砍人。如果耦合很低,点击左侧页面,只是向一个类A发送信息,那么之后这个类A不会改变,那么左侧页面就不会进行修改,如果需要修改功能页面。如果这时有一个按钮可以控制功能页面,那么这个按钮同样对类A发送消息就可以,不需要去关心里面的逻辑,而功能页面通过监听类A的事件,可以绑定当前功能页面的对应列,所以这个设计是比刚才的方法比较好的。

接下来继续将一个多页面通信的问题。假如有一个程序,看起来和下面的图一样,有主页面,主页面有多个页面,那么这时,如何对这些页面进行通信?假如需要点击主页面的一个按钮,控制页面A中的元素,那么如何做?简单的方法是直接主页面知道页面A,直接对他元素修改。但是这个方法很容易看到,耦合很高,如果页面A修改了,那么这时就无法在不修改主页面继续运行。如果更复杂的项目,可能需要修改的地方就会很多,如果有新人不知道,没有修改所有的地方,很容易就出现软件的质量差。

如果同样可以通过主页面向另一个类B发送信息,页面A监听类B,所以页面A就可以得到主页面需要删除元素的信息,由A页面来删除元素,这样可以做到耦合比较低。那么问题在很多情况都需要创建一个类来接收消息,而需要页面去获得消息,是否可以做出一个框架?我的框架就是这样想到,本来 MVVMLight 也有这样功能,看起来他的功能比较多,所以我就自己写一个,当然看完本文,相信大神们很容易就写出自己的框架。

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系