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