MVVM – 面試問題



模型、檢視、ViewModel(MVVM 模式)都是關於指導你如何組織和構建程式碼以編寫可維護、可測試和可擴充套件的應用程式。

模型 - 它僅僅持有資料,與任何業務邏輯無關。

ViewModel - 它充當模型和 ViewModel 之間的連結/連線,並使事物看起來很漂亮。

檢視 - 它只儲存格式化的日期,並且基本上將所有內容委託給模型。

主要好處是允許檢視和模型之間真正的分離,超越實現分離以及從擁有該分離獲得的效率。在現實中,這意味著當您的模型需要更改時,它可以輕鬆更改,而無需檢視更改,反之亦然。

應用 MVVM 會產生三個關鍵要素 -

  • 可維護性
  • 可測試性
  • 可擴充套件性
  • 有些人認為,對於簡單的 UI,MVVM 可能有點過頭了。
  • 同樣,在更大的情況下,設計 ViewModel 可能很困難。
  • 當我們有複雜的資料繫結時,除錯會有點困難。

通常,模型是最容易理解的。它是客戶端資料模型,支援應用程式中的檢視。

  • 它由具有屬性和一些變數的物件組成,用於在記憶體中儲存資料。

  • 其中一些屬性可能引用其他模型物件並建立物件圖,作為一個整體,這些物件是模型物件。

  • 模型物件應該引發屬性更改通知,在 WPF 中意味著資料繫結。

  • 最後一個職責是驗證,這是可選的,但您可以透過使用 WPF 資料繫結驗證功能(透過 INotifyDataErrorInfo/IDataErrorInfo 等介面)將驗證資訊嵌入到模型物件中。

檢視的主要目的和職責是定義使用者在螢幕上看到的內容的結構。該結構包含靜態和動態部分。

  • 靜態部分是 XAML 層次結構,定義了檢視由其組成的控制元件和控制元件佈局。

  • 動態部分就像動畫或狀態更改,這些更改被定義為檢視的一部分。

  • MVVM 的主要目標是在檢視中不應該有程式碼隱藏。

  • 在檢視中,您至少需要建構函式和對初始化元件的呼叫。

  • 事件處理、操作和資料操作邏輯程式碼不應該在檢視的程式碼隱藏中。

  • 還有一些其他型別的程式碼必須進入程式碼隱藏中,任何需要引用 UI 元素的程式碼。它本質上是檢視程式碼。

  • ViewModel 是 MVVM 應用程式的主要點。ViewModel 的主要職責是向檢視提供資料,以便檢視可以將該資料放在螢幕上。

  • 它還允許使用者與資料互動並更改資料。

  • ViewModel 的另一個關鍵職責是封裝檢視的互動邏輯,但這並不意味著應用程式的所有邏輯都應該進入 ViewModel。

  • 它應該能夠處理適當的呼叫順序,以便根據使用者或檢視上的任何更改做出正確的操作。

  • ViewModel 還應該管理任何導航邏輯,例如決定何時導航到不同的檢視。

有兩種方法可以構造檢視。您可以使用其中任何一種。

  • XAML 中的檢視優先構造
  • 程式碼隱藏中的檢視優先構造

一種方法是簡單地將您的 ViewModel 作為巢狀元素新增到 DataContext 屬性的 setter 中,如下面的程式碼所示。

<UserControl.DataContext> 
   <viewModel:StudentViewModel/> 
</UserControl.DataContext>

另一種方法是,您可以透過在檢視的程式碼隱藏中自行構造 ViewModel 來執行檢視優先構造,透過使用該例項設定 DataContext 屬性。

通常,DataContext 屬性是在檢視的建構函式方法中設定的,但您也可以將構造延遲到檢視的 Load 事件觸發。

using System.Windows.Controls;

namespace MVVMDemo.Views { 
   /// <summary> 
      /// Interaction logic for StudentView.xaml 
   /// </summary> 
	
   public partial class StudentView : UserControl { 
      public StudentView() { 
         InitializeComponent(); 
         this.DataContext = new MVVMDemo.ViewModel.StudentViewModel(); 
      } 
   } 
}

在程式碼隱藏而不是 XAML 中構造 ViewModel 的主要原因是 ViewModel 建構函式需要引數,但 XAML 解析只能在預設建構函式中定義的情況下構造元素。

ViewModelLocator 提供了一種標準、一致、宣告式和鬆散耦合的方式來執行檢視優先構造,該構造自動化了將 ViewModel 連線到檢視的過程。以下是 ViewModelLocator 的高階流程。

ViewModelLocator
  • 確定正在構造哪個檢視型別。
  • 識別該特定檢視型別的 ViewModel。
  • 構造該 ViewModel。
  • 將檢視的 DataContext 設定為 ViewModel。

資料繫結是將 MVVM 與其他 UI 分離模式(如 MVC 和 MVP)區分開來的關鍵特性。

資料繫結可以是單向或雙向的,以便在檢視和 ViewModel 之間來回傳遞資料。

隱式資料模板可以根據使用資料繫結呈現的資料物件的型別,自動從當前資源字典中為使用資料繫結的元素選擇合適的模板。首先,您需要有一些元素繫結到資料物件。

命令模式中有兩個主要參與者,呼叫者和接收者。

呼叫者

呼叫者是一段可以執行一些命令式邏輯的程式碼。通常,它是在 UI 框架上下文中使用者互動的 UI 元素。但它可能只是應用程式其他地方的另一段邏輯程式碼。

接收者

接收者是呼叫者觸發時要執行的邏輯。在 MVVM 的上下文中,接收者通常是您需要呼叫的 ViewModel 中的方法。

在呼叫者和接收者之間,您有一個阻礙層,它不允許呼叫者和接收者明確地瞭解彼此。這通常表示為公開給呼叫者的介面抽象,並且該介面的具體實現能夠呼叫接收者。

不,如果內容塊只是提供渲染某些內容到螢幕上的結構,並且不支援使用者對該內容的任何輸入或操作。它可能不需要單獨的 ViewModel,但它可能只是一個根據父 ViewModel 公開的屬性進行渲染的 XAML 塊。

當您的應用程式開始接受來自終端使用者的輸入資料時,您需要考慮驗證該輸入。以確保它符合您的整體要求。

您可以使用以下 WPF 資料繫結支援的驗證表達方式 -

  • 在設定屬性時引發異常。
  • 實現 IDataErrorInfo 介面。
  • 實現 INotifyDataErrorInfo。
  • 使用 WPF 驗證規則。

控制反轉 (IoC) 和依賴注入是兩種緊密相關的設計模式,容器基本上是基礎設施程式碼的一部分,它為您執行這兩種模式。IoC 模式是關於委託構造的責任,而依賴注入模式是關於向已構造的物件提供依賴項。

事件是一種程式設計結構,它對狀態更改做出反應,通知任何已註冊通知的端點。主要地,事件用於透過滑鼠和鍵盤通知使用者輸入,但它們的用途並不侷限於此。每當檢測到狀態更改時,也許是在物件載入或初始化時,可以觸發事件以提醒任何感興趣的第三方。

廣告

© . All rights reserved.