zoukankan      html  css  js  c++  java
  • WPFMVVMLight框架学习使用MVVMLight

    这只是我学习的笔记,大家学习请参考原作者。

    参考学习视频:https://www.bilibili.com/video/av40886206/

    参照学习博客:https://www.cnblogs.com/wzh2010/p/6285990.html

    1,在项目中使用MVVMLight

    【1.1】Nuget中搜索MVVMLight

     【1.2】添加完成之后,会多出一些文件

    完成之后多出ViewModel文件夹,包含以下两个文件:

      MainViewModel.cs

      ViewModelLocator.cs

      另外App.xaml里将ViewModelLocator作为资源添加全局的Application.Resources里:

     【1.3】如果有报错,是命名引用命名空间导致的,解决办法:

    2,Model,View,ViewModel,

    如图:
    1、View负责前端展示,与ViewModel进行数据和命令的交互。
    2、ViewModel,负责前端视图业务级别的逻辑结构组织,并将其反馈给前端。
    3、Model,主要负责数据实体的结构处理,与ViewModel进行交互。

    先建立一个完整三层结构的目录,如图,包含Model、View、ViewModel三层文件夹:

    【2.1】Model

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using GalaSoft.MvvmLight;//添加引用
    
    namespace WPF_MVVMLight.Models
    {
       public class StudentModel: ObservableObject//添加继承这个ObservableObject类(可观测的类)
       {
           private int id;
    
           public int Id
           {
               get =>id;
               set
               {
                   id = value;
                   RaisePropertyChanged(()=>Id);
               }
           }
    
           private string name;
    
           public string Name
           {
               get => name;
               set
               {
                   name = value;
                   RaisePropertyChanged(() => Name);
               }
           }
        }
    
    }
    

      

    很简单,仅仅是包含一个实体对象,这边注意的的是那他继承了一个父类:ObservableObject,这个父类的作用就是保证能够检测属性是否被改变。
    它实现了INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的;
    所以我们在定义实体对象的时候,只需要调用RaisePropertyChanged(PropertyName)就可以进行属性更改通知了。
    所以实体里面定义的每个属性都加上RaisePropertyChanged(PropertyName)的调用,就可以实现对UI的交互更新了。

    【2.2】ViewMedol:跟View交互

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using GalaSoft.MvvmLight;
    using WPF_MVVMLight.Models;
    
    namespace WPF_MVVMLight.ViewModel
    {
        public class StudentViewModel : ViewModelBase
        {
            public StudentViewModel()
            {
                if (IsInDesignMode) //如果是设计模式
                {
                    StudentModel=new StudentModel(){Id=1,Name = "张三"};
                }
                else//运行模式
                {
                    //模拟从数据库取数据
                    StudentModel = new StudentModel() { Id = 2, Name = "李四" };
                }
            }
            public Models.StudentModel StudentModel { get; set; }
        }
    }
    

      

    也很简单,继承了ViewBaseModel父类,
    ViewBaseModel同时继承 ObservableObject类和ICleanup接口。所以他同样有INotifyPropertyChanged接口的能力,
    能够通过触发PropertyChanged事件达到通知View的目的;
    构造函数中对 StudentModel属性进行了实例化。

     【2.3】VIew:显示和交互ViewModel

    Label Content绑定了StudentModel.Id和Name属性,所以Label应该显示StudentModel对象的Id和Name属性

     这时候的ViewModel和View是没有任何关系的,所以我们在View的构造函数中写上如下代码: 

    3,构造器

    【3.1】

    所以每次App初始化的时候,就会去初始化ViewModelLocator类。

    实际上他就是一个很基本的视图模型注入器。在构造器中把使用到的ViewModel统一注册,并生成单一实例。
    然后使用属性把它暴露出来,每当我们访问属性的时候,就会返回相应的ViewModel实例。

    【3.2】注册StudentViewModel实例

    【3.3】 View中:删除new对象的代码

  • 相关阅读:
    爱的感悟
    连点成图:享受创建图形的乐趣
    python实现动态更新远程机器列表的SSH登录脚本
    python生成数据库中所有表的DESC描述
    生活之美
    克服“测试怠惰”的习惯
    使用git和github托管个人项目
    连点成线
    一次合并数据库的经历
    python使用装饰器捕获异常
  • 原文地址:https://www.cnblogs.com/baozi789654/p/15751035.html
Copyright © 2011-2022 走看看