WPF-MVVMLight框架學習--使用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對象的代碼

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM