WPF 中的MVVM

前言

在系统的开发中,不能很好的吧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, 采用有一个设计方法

-添加

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值