前言
在系统的开发中,不能很好的吧UI和业务逻辑分离,自己的做法不够科学,主要思路还是和Winform事件驱动一样,因此写此贴梳理一下WPF的MVVM使用
Problem
- 对象注入
Class A
{
string _Name//声明
private void ()
{ _Name=new Name(){ 属性赋值}}//确定引用
}
- local:ViewMode/ 报错名称空间下不存在
重新生成解决方案
Debug _release _debug 换一换 - Mode的类需不需要实现 NotifyPropertyChange接口
MVVM概述
mode:对客观事物的建模
View:用户操作界面
viewmode:对View的mode,如界面的一个TextBlock要显示一个变量A的值,在ViewMode应建立一个Pubilic属性A,在Xmal中将TextBlockde text ={Binding A }.
- ViewMode 与View的关联
** 数据关联**为双向,在VIew 中创建的控件,控件的属性BindingViewMode中的属性;在ViewMode中建立共有属性,同时ViewMode类实现INOtifyPropertyChange接口,实现该接口中的委托,同时建立属性改变通知方法,参数为属性名称。在属性的set方法中,调用该属性改变方法,通过这个结构通知到BInding,然后Binding从自身开始,寻找CONtext,建立View和ViewMode的连接关系。
class StationGraphOptionViewMode : INotifyPropertyChanged//实现接口
{
//数据属性
private int num=10;//保护的接收 字段
public int Num//暴露的属性
{
get { return num; }
set { num = value;
RaisePropertyChange("Num");//属性改变方法(参数为属性名称)
}
}
//属性改变方法
private void RaisePropertyChange(string propertyName)
{
PropertyChangedEventHandler hander = PropertyChanged;//事件处理器
if (hander != null)
{
hander(this, new PropertyChangedEventArgs(propertyName));//处理消息
}
}
命令的绑定
单向,建立Command类,类中有命令的执行 ,
在VIEWMode中 创建Command对象,对象的执行委托中添加 命令下执行的方法,
在VIEW中的控件绑定 VIEWmOde中的命令对象。当UI中的控件被触发时,命令被响应,然后执行响应的方法,在方法中改变属性时,通知到Binding 。UI再改变。
class DelegeteCommand : ICommand//实现接口
{
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
if (CanExecuteFunc == null)//不检查
{
return true;
}
else
return CanExecuteFunc(parameter);
}
public void Execute(object parameter)//执行命令
{
this.ExecuteAction(parameter);//委托,参数为一个执行的方法
}
public Action<object> ExecuteAction { get; set; }
public Func<object, bool> CanExecuteFunc { get; set; }
}
- 一个控件有多个事件,但默认的COmmand只有一个事件,添加引用,使得每一个控件的事件有自己的命令。在命令中执行对应的命令
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"//添加引用
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked" >
<i:InvokeCommandAction Command="{Binding ShowSignalCommand }" ></i:InvokeCommandAction>//对小事件的命令
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked" >
<i:InvokeCommandAction Command="{Binding NotShowSignalCommand }" ></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
-
数据的BinDing,绑定的Mode设置为双向,数据可以在View和ViewMode的双向传递。
-
Mode 与VIEWMode的关联
public string GraphName//UI 绑定
{
get { return m_stationGraph.StationName; }//mode中的内容
set{
m_stationGraph.StationName = value;
RaisePropertyChange("GraphNmae");
}
}
public void CreatNewGrapView( StationGraph stationGraph)/、窗口间传递
{
m_stationGraph = stationGraph;
MVVM多窗口传递
主次窗口建立一个ViewMode,方便数据的传输。
个人的理解
MVVM 中ViewMode与View实现命令和数据传递
- 命令的传递:创建一个命令类,继承ICommand的接口,实现接口中的方法。在VIEWmode中 创建命令实例,在构造方法中建立命令对象的引用,在命令对象的执行委托中添加执行的方法即可。在View的 控件Commond属性binding ViewMode中的命令名称。当对一个控件的不同事件Bindin不同的命令。完成了UI的命令的传递,对数据进行处理,相当于WINform 的事件。
- 数据的传递,在VIEWMode,利用propful 快捷键创建一个属性和字段组合,通过属性暴露出字段的内容。ViewNMOde类实现INOtifyProperty接口,建立属性变化的方法,参数为属性名称。当属性的值发生变化时,调用属性变化的事件响应办法。在VIEW中Bindin属性名称,同时制定dataContext为ViewMOde。从而建立View和VieMode的数据连接,设置绑定为双向绑定能实现数据的双向传递。
高级案例
-
确定界面的本质分析,从而确定ViewMode
-
注意 有service,用于放哪一部分的代码
-
彩打数据为一个XML文件,与调监模块的数据存储比较相似
-
建立文件夹Data 用于存储,实际为网络中读取,使用接口把定义
-
Service层
理解:对基础数据的处理,读写,操作数据
定义,一个读取接口(接口中建立一个读取文件的方法)
经历一个XmldataService类,实现读取文件的接口。如果数据源变化时,可以对接口的实现不同。
注意,当使用依赖注入时改变更小,未来补充 -
mode 问价夹
-
建立数据结构的类, 道岔类——属性 位置,颜色,大小等。当属性要在界面显示,继承INotification接口。一般来说视为ViewMMode服务的,不建议实现接口
-
菜单的建模
-
餐馆的建模
注意 餐馆的属性直接显示,但最好把ViewMOde中的数据显示在UI,起到过滤和保护的作用。 -
** ViewMode**
属性:餐馆的显示内容
注意是否被选中,不是菜的属性 。选中与否是ViewMod的就一个属性,每一个菜单建立一个ViewMode。即为一条数据。ViewMode中有一个Mode, 采用有一个设计方法
-添加