這只是我學習的筆記,大家學習請參考原作者。
參考學習視頻: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對象的代碼


