第十八章:MVVM(二)

wangccsy發表於2018-10-09

ViewModels和資料繫結

在MVVM的許多相當簡單的演示中,模型不存在或僅暗示,並且ViewModel包含所有業務邏輯。 View和ViewModel通過基於XAML的資料繫結進行通訊。 檢視中的可視元素是資料繫結目標,ViewModel中的屬性是資料繫結源。
理想情況下,ViewModel應獨立於任何特定平臺。 除了Xamarin.Forms之外,這種獨立性允許ViewModel在其他基於XAML的環境(例如Windows)之間共享。 因此,您應該儘量避免在ViewModel中使用以下語句:

using Xamarin.Forms;

本章經常打破這條規則! 其中一個ViewModel基於Xamarin.Forms Color結構,另一個使用Device.StartTimer。 因此,讓我們在ViewModel中呼叫避免Xamarin.Forms特有的任何“建議”而不是“規則”。
View中的可視元素有資格作為資料繫結目標,因為這些可視元素的屬性由可繫結屬性支援。 要成為資料繫結源,ViewModel必須實現通知協議,以便在ViewModel中的屬性發生更改時發出訊號。 此通知協議是INotifyPropertyChanged介面,它僅在一個事件中非常簡單地在System.ComponentModel名稱空間中定義:

public interface INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
}

NotifyPropertyChanged介面是MVVM的核心,在非正式討論中,介面通常縮寫為INPC。
INotifyPropertyChanged介面中的PropertyChanged事件的型別為PropertyChanged-EventHandler。 此PropertyChanged事件處理程式的處理程式獲取PropertyChangedEventArgs類的例項,該類定義名為PropertyName的型別為string的單個屬性,指示ViewModel中的哪個屬性已更改。 然後,事件處理程式可以訪問該屬性。
實現INotifyPropertyChanged的類應該在公共屬性發生更改時觸發PropertyChanged事件,但是在僅設定屬性但未更改屬性時,類不應觸發事件。

有些類定義了不可變屬性 – 在建構函式中初始化的屬性,然後永遠不會更改。 這些屬性不需要觸發PropertyChanged事件,因為只有在建構函式中的程式碼完成後才能附加PropertyChanged處理程式,並且不可變屬性在此之後永遠不會更改。
理論上,ViewModel類可以從BindableObject派生,並將其公共屬性實現為BindableProperty物件。 BindableObject實現INotifyPropertyChanged,並在BindableProperty支援的任何屬性發生更改時自動觸發PropertyChanged事件。 但是從BindableObject派生對於ViewModel來說是過度的。 因為BindableObject和BindableProperty特定於Xamarin.Forms,所以這樣的ViewModel不再是平臺無關的,並且該技術與簡單的INotifyPropertyChanged實現相比沒有真正的優勢。


相關文章