WPFMVVMLight框架学习使用MVVMLight

摘要:
因此,它还具有INotifyPropertyChanged接口的功能,可以通过触发PropertyChanged事件通知视图;StudentModel属性在构造函数中实例化。

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

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

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

1,在项目中使用MVVMLight

【1.1】Nuget中搜索MVVMLight

WPFMVVMLight框架学习使用MVVMLight第1张

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

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

  MainViewModel.cs

  ViewModelLocator.cs

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

WPFMVVMLight框架学习使用MVVMLight第2张

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

WPFMVVMLight框架学习使用MVVMLight第3张

2,Model,View,ViewModel,

WPFMVVMLight框架学习使用MVVMLight第4张

如图:
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

WPFMVVMLight框架学习使用MVVMLight第5张

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

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

WPFMVVMLight框架学习使用MVVMLight第6张

3,构造器

【3.1】

WPFMVVMLight框架学习使用MVVMLight第7张

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

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

【3.2】注册StudentViewModel实例

WPFMVVMLight框架学习使用MVVMLight第8张

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

WPFMVVMLight框架学习使用MVVMLight第9张

WPFMVVMLight框架学习使用MVVMLight第10张

免责声明:文章转载自《WPFMVVMLight框架学习使用MVVMLight》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL5.7表空间加密U9单据打印模板自定义扩展字段显示名称下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UNIX环境编程学习笔记(22)——进程管理之system 函数执行命令行字符串

lienhua342014-10-15 ISO C 定义了 system 函数,用于在程序中执行一个命令字符串。其声明如下, #include <stdlib.h> int system(const char *cmdstring); system 函数在其实现中调用了 fork、exec 和 waitpid 函数。system 函数调用...

EF中的批量操作

阅读目录 插入 更新 删除 在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率。那么这篇文章就来总结EF中的那些批量操作。 回到顶部 插入 1,单个插入 单个插入很简单,只需要构造好实体,然后调用DbSet的Add方法,最后Sav...

云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core团队

在昨天的博文中,我们坚持认为数据库连接数过万是阿里云RDS的问题,但后来阿里云提供了当时的数据库连接情况,让我们动摇了自己的想法。 帐户 连接数 A 4077 B 3995 C 741 D 698 E 519 上面这5个帐户产生了10030个数据库连接,当看前4个帐户(产生了9511个连接)的名称时,我们打了一个寒颤 —— 这些...

System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。

今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。 解决方案:下载2007 Office system 驱动程序:数据连接组件安装http://download.microsoft.com/dow...

c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法

c# 图片保存为流Stream,再次加载时提示System.ArgumentOutOfRangeException: 要求非负数的解决办法 保存为流的时候,用下面的代码 imgstream.Seek(0, System.IO.SeekOrigin.Begin); MemoryStream imgstream = new MemoryStream(); im...

redis 在java中的使用

1、首先下载jar包放到你的工程中 2、练习 package com.jianyuan.redisTest; import java.util.Iterator;import java.util.List;import java.util.Set; import redis.clients.jedis.Jedis; public class RedisT...