1. 程式人生 > >MVVMLight學習筆記(二)---MVVMLight框架初探

MVVMLight學習筆記(二)---MVVMLight框架初探

一、MVVM分層概述

MVVM中,各個部分的職責如下:

Model:負責資料實體的結構處理,與ViewModel進行互動;

View:負責介面顯示,與ViewModel進行資料和命令的互動; ViewModel:負責前端檢視業務級別的邏輯結構組織,並將其反饋給前端。   二、MVVMLight框架初探 通過NuGet安裝MVVM Light 框架後,我們新建的Wpf專案中會自動生成一個ViewModel資料夾,裡面有MainViewModel.cs和ViewModelLocator.cs兩個檔案。 下面我們就首先分析下這兩個檔案的內容: MainViewModel.cs檔案分析:
MainViewModel.cs檔案中只有一個類MainViewModel,該類是主視窗MainWindow對應的ViewModel,繼承自類ViewModelBase ViewModelBase類又繼承類ObservableObject,同時實現ICleanup介面 ObservableObject類實現INotifyPropertyChanged介面,用於通知屬性的改變 由此分析,我們可以得出以下一般結論: 當我們定義一個自己的ViewModel時,一般讓自定義ViewModel繼承自ViewModelBase類,這樣當ViewModel中屬性發生變化的時候,就可以自動通知對應的VIew。
  ViewModelLocator.cs檔案分析: ViewModelLocator.cs檔案中只有一個ViewModelLocator類,類中包括一個建構函式、一個型別為MainViewModel的Main屬性、以及一個靜態的Cleanup函式。    
 public class ViewModelLocator
    {
        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        
/// </summary> public ViewModelLocator() { ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); ////if (ViewModelBase.IsInDesignModeStatic) ////{ //// // Create design time view services and models //// SimpleIoc.Default.Register<IDataService, DesignDataService>(); ////} ////else ////{ //// // Create run time view services and models //// SimpleIoc.Default.Register<IDataService, DataService>(); ////} SimpleIoc.Default.Register<MainViewModel>(); } public MainViewModel Main { get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } } public static void Cleanup() { // TODO Clear the ViewModels } }

在建構函式中,建立了一個SimpleIoc型別的單例項,用於註冊ViewModel,然後用ServiceLocator對這個SimpleIoc型別的單例項進行包裹,方便統一管理。
觀察App.xaml檔案,我們會發現ViewModelLocator類被生成資源字典並加入到了全域性資源,所以每次App初始化的時候,就會去初始化ViewModelLocator類。

實際上,他是一個很基本的檢視模型注入器,在構造器中把使用到的ViewModel統一註冊,並生成單一例項。然後使用屬性把它暴露出來,每當我們訪問屬性的時候,就會返回相應的ViewModel例項。  
<Application x:Class="MvvmLightDemo.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             xmlns:local="clr-namespace:MvvmLightDemo" StartupUri="MainWindow.xaml" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             d1p1:Ignorable="d" xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
  <Application.Resources>
    <ResourceDictionary>
      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" xmlns:vm="clr-namespace:MvvmLightDemo.ViewModel" />
    </ResourceDictionary>
  </Application.Resources>
</Application>

由此分析,我們可以得出以下一般結論:

當我們自定義一個ViewModel的時候,就可以在ViewModelLocator類的建構函式中對ViewModel進行註冊,然後在該類中定義一個屬性,用於返回我們的自定義ViewModel