MVVM复习
MVVM结构
- 用户-->界面,双向=》用户将数据输入给界面,操作施加给界面==》界面将数据和消息反馈给用户
- View和ViewModel交互主要依靠两种属性
- 数据属性=》双向==》数据依靠数据属性来回传递,
- 命令属性=》单向==》View -->ViewModel,永远只是把操作从界面传送到ViewModel
- ViewModel和Model、Service的交互都是双向的
数据属性基类NotificationObject
-
创建ViewsModels的基类NotificationObject具有通知能力的一个对象,派生自INotifyPropertyChanged
-
为什么需要这个对象:因为ViewsModel 和View交互,需要把自己的变化通知给View,就是靠WPF的DataBinding来通知,当一个值变化以后,通过某种机制通知Binding,Binding再把数据传输到View上,ViewsModel通知Binding,请你把我的数据传输到View上。
-
如何实现通知:通过一个事件,继承INotifyPropertyChanged接口,在派生类中实现接口成员(PropertyChanged事件)
-
如果某一个对象的属性借助DataBinding关联到了界面上的某个元素上,如果ViewModel上的某个属性借助DataBinding关联到View上的某个控件,当这个值变化的时候,实际上Binding就是在监听着PropertyChanged这个事件有没有发生,一旦发生,他就把变化后的值送到界面上去。
//具备通知能力 实现对应事件
class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
//对事件进行简单封装
public void RaisePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
//告诉Binding那个属性的值发生了改变
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
命令属性基类DelegateComman
-
创建DelegateCommand类,派生自ICommand
-
实现对应的三个成员:
- CanExecute,能不能做?用来帮助命令的呼叫者,判断这个命令能不能执行
- EventHandler,执行的状态!当这个命令能不能执行状态发生改变时,通知命令的调用者,告诉他状态
- Execute,做什么事?最为重要的是这个命令,当命令执行的时候,做什么事情
-
声明一个Action