没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
21页
MVVM是Model、View、ViewModel的简写,这种模式的引入就是使用ViewModel来降低View和Model的耦合,说是降低View和Model的耦合。也可以说是是降低界面和逻辑的耦合,理想情况下界面和逻辑是完全分离的,单方面更改界面时不需要对逻辑代码改动,同样的逻辑代码更改时也不需要更改界面。同一个ViewModel可以使用完全不用的View进行展示,同一个View也可以使用不同的ViewModel以提供不同的操作。
资源推荐
资源详情
资源评论
MVVM 模式简介
MVVM 是 Model、View、ViewModel 的简写,这种模式的引入就是使用
ViewModel 来降低 View 和 Model 的耦合,说是降低 View 和 Model 的耦合。
也可以说是是降低界面和逻辑的耦合,理想情况下界面和逻辑是完全分离的,
单方面更改界面时不需要对逻辑代码改动,同样的逻辑代码更改时也不需要更
改界面。同一个 ViewModel 可以使用完全不用的 View 进行展示,同一个
View 也可以使用不同的 ViewModel 以提供不同的操作。
1.Model
Model 就是一个 class,是对现实中事物的抽象,开发过程中涉及到的事物都
可以抽象为 Model,例如客户,客户的姓名、编号、电话、住址等属性也对应
了 class 中的 Property,客户的下订单、付款等行为对应了 class 中的方法。
2. View
View 很好理解,就是界面。
3. ViewModel
上面说过 Model 抽象,那么 ViewModel 就是对 View 的抽象。显示的数据对
应着 ViewMode 中的 Property,执行的命令对应着 ViewModel 中的
Command。
WPF 中 MVVM 的解耦方式
在 WPF 的 MVVM 模式中,View 和 ViewModel 之间数据和命令的关联都是通
过绑定实现的,绑定后 View 和 ViewModel 并不产生直接的依赖。具体就是
View 中出现数据变化时会尝试修改绑定的目标。同样 View 执行命令时也会去
寻找绑定的 Command 并执行。反过来,ViewModel 在 Property 发生改变
时会发个通知说“名字叫 XXX 的 Property 改变了,你们这些 View 中谁绑定了
XXX 也要跟着变啊!”,至于有没有 View 收到是不是做出变化也不关心。
ViewModel 中的 Command 脱离 View 就更简单了,因为 Command 在执行
操作过程中操作数据时,根本不需要操作 View 中的数据,只需要操作
ViewModel 中的 Property 就可以了,Property 的变化通过绑定就可以反映
到 View 上。这样在测试 Command 时也不需要 View 的参与。这也是我在接
触 WPF 初期时根本理解不了的所谓数据驱动。
这样一来 ViewMode 可以在完全没有 View 的情况下测试,View 也可以在完
全没有 ViewModel 的情况下测试(当然只是测试界面布局和动画等业务无关的
内容)。
MVVM 框架需要解决的问题
从图中可以看出如果要实现一套 MVVM 框架,需要解决的最基本的问题就是数
据绑定和命令绑定。此外由于 UI 中会产生大量的事件,因此还需要将事件绑定
到 MVVM 中的命令上。后面的文章将依次尝试解决这些问题。最后还是要说一
下任何设计模式都是参考,都有使用场景,切忌生搬硬套。实际开发中应根据
项目特点采取适配性更强的模式。
数据绑定
数据绑定要达到的效果
数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上
的修改能反映到绑定源,同时绑定源的修改也能反映到界面上。从界面反映到
绑定的数据源是很容易理解的,因为在绑定过程中我们指定了 DataContext
和 Binding 的对象,很容易找到绑定的源并修改。但数据源修改时怎么通知界
面呢?因为 ViewModel 中被绑定的属性并不知道谁绑定了它,如果在
ViewModel 中存一个 View 的引用,在数据发生变化时修改 View,这无疑又
将 ViewModel 和 View 耦合在了一起,而且这样做 View 中相应的控件没有开
发完善难以进行测试,同样 View 中控件类型或名称发生改变时,ViewModel
中相关代码都需要修改。在 WPF 中从数据源通知界面发生变化是通过发送通知
的方式进行的,你可以想象一个 string 类型的 Property,名字是
TestString,在它发生变化时对着 View 大喊“TestString 发生变化了,你们谁
绑定了 TestString 需要跟着变啊!”,至于绑定的是 TextBlock 的 Text,还是
Label 的 Content,还是 TextBox 的 Text,ViewModel 并不关心,同样喊了
后结果如何 ViewModel 也不关心。View 在收到这个通知后看有没有绑定 了
TestString 的地方,找到了就修改,找不到就不管了,也不会在乎这个通知是
哪个类型的 ViewModel 发的。这样 ViewModel 和 View 就解耦了,谁也不依
赖对方。
INofyPropertyChanged 接口
在 WPF 中能够实现 ViewModel 向 View 喊话功能的就是
INotifyPropertyChanged 接口,它就像一个大喇叭一样,我们实现了这个接
口,就可以通过触发 PropertyChanged 事件并给出改变的数据源的对象和属
性名称,以此来通知数据的变化。这个接口的实现是非常简单的,下图代码就
是一种非常简易的实现方式。由于在 MVVM 中所有的 ViewModel 和部分
Model 都需要实现这个接口来达到绑定的效果,因此一般会专门用一个类来实
现这个接口,并将这个类作为 ViewModel 等需要数据更改后发送通知的类的
基类。
ObservableCollecon<T>集合
NotifyObject 貌似把一切都解决了,但是考虑这样一种情况,有一个
List<string>列表显示人员名单,View 中的一个 ListBox 绑定了这个列表。
每次我们添加新成员时,为了能在 View 中立即看到结果必须调用
RaisePropertyChanged 方法让 ListBox 控件重新加载数据源。这种做法执
行了大量的无效操作,就像我们只是改变了屏幕上一小部分内容却要刷新整个
屏幕以更新显示一样。如果添加的不是人员而是一种添加动作频繁发生的操作,
这种无效操作会极大影响性能。因此 WPF 提供了一个
ObservableCollection<T>集合,可以将数据项的添加、删除等反映到 View
中绑定的控件上而无需我们做任何操作。所以在遇到对集合添加、删除等操作
又需要使用数据绑定时要优先考虑 ObservalbeCollection<T>。
剩余20页未读,继续阅读
资源评论
star_of_light
- 粉丝: 30
- 资源: 22
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功