你的位置:首页 > ASP.net教程

[ASP.net教程]wpf框架模型分析


一、MVVM模式介绍:

  在网上看过很多的MVVM中各块的介绍,感觉很混乱。找到如下的描述感觉很合理,也很好理解(https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx)。

 

二、模式分析

  在项目中使用这个模型,感觉有2点需要理解透,不然项目运行中肯定得乱套。

  • 如上图描述的模块的角色和职责。

  上面描述的很清楚了,但是几点地方总结下:

  1)有些地方将Model看成是只有数据的对象,但是这里显然不是。

  2)View 的Ui Logic指的是控件自己的一些显示逻辑,比如某些动画。(不知道其他怎么理解的,后续我们会把窗口的创建等都放在这里)。

  3)ViewModel的界面呈现逻辑有时候容易和Model的业务逻辑混在一起。

  • 模块之间的通信。

  模块通信包括View和ViewModel、ViewModel和ViewModel、ViewModel和Model之间的通信。

三、项目分析

1、需求:

1) 窗口统一管理,自动维护窗口及子窗口的生命周期。同时包括模态及非模态窗口。

2) 分离界面,界面逻辑,后台呈现逻辑,不包括其他界面或模块逻辑,界面职责明确独立。

3) 界面生命周期检测,业务逻辑处理与生命周期同步,即界面销毁不响应界面逻辑处理。

4) 窗口业务逻辑之间的通信传递便利,降低通信的代码成本。

5) 适应WPF的特性。比如binding,Command之类的。

 

2、分析

1)、父窗口与子窗口的生命周期同步

在wpf里,子窗口和父窗口设置ower关系存在如下问题:

父窗口关闭,方法内的模态窗口也会关闭。只要设置owner属性。必须在父窗口关闭之前手动关闭,否则窗口会卡住。

父窗口关闭,非模态窗口也会一起关闭,只要设置owner属性。任务栏问题,只显示父窗口的。

所以需要自建窗口管理模块管理子窗口的销毁。

2)、MVVM模式分析

让UI界面与逻辑能够很好地分离又协同工作,调研MVVMLight,使用binging、Command和Messenger可以达到以上目标。

 

四、模型设计

  通过以上的分析项目中使用的模型如下。

 

 

 

1、Window Manager

工厂化窗口的创建,窗口销毁的反注销,父子窗口的生命周期绑定,以及窗口的业务逻辑的反注册。

2、View

MVVM模式中的第一个V,包括窗口及子视图。所有的与界面元素有关的内容,请放在此处操作。

一般情况下,View和ViewModel是一一对应的,生命周期一致,因为如果ViewModel还能响应数据,但是窗口销毁了,有可能产生异常或者让人很难理解的地方。

 

3、ViewModel

MVVM模式中的VM。

4、Model

MVVM模式中的M,主要后台业务模型。这个地方的模型有可能是线程只能的有通知能力的模块(比如线程拉取服务消息通知界面展示)

5、View和ViewModel的通信

View和Viewmodel的数据通过binging;View的事件通过Command传递给Viewmodal;Viewmodal通过messenge通知事件到View,在View中WindowMessage创建View。

6、ViewModel和ViewModel的通信

通过messenge的方式需要在窗口关闭的时候反注册。通过Window Manager统一来处理。

7、ViewModel和Model的通信

ViewModel可以直接Call Model的方法;Model和ViewModel通过代理方式(messenger)通信,需要在窗口关闭的时候反注册。通过Window Manager统一来处理。

Model的通知消息(线程类的拉取消息)通知消息,如果有ViewModel注册该消息会收到通知。

8、其他

l Messenger调查

Messenger.Default.Register<string>(this, "hahaClose", OnHHClose);

 

Messenger.Default.Unregister(this);

 

Messenger.Default.Send<string>("132123", "hahaClose");

 

如果没有注册就调用Send,不会出错;

注册的响应必须手动释放,在窗口关闭的时候不会自动去掉这个关联关系。

从以上可以看到,窗口间通信支持复杂的对象。