第十八章:MVVM(二)
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實現相比沒有真正的優勢。
相關文章
- 第十八章:MVVM(十)MVVM
- 達芬奇密碼 第十八章密碼
- 第十八章 物件導向的特性物件
- 移動端第十八章 rem適配佈局REM
- 第十八章:併發程式的基本實現( 多程式 )
- WPF使用MVVM(二)-命令繫結MVVM
- MVVM框架的搭建(二)——專案搭建MVVM框架
- Swift-MVVM 簡單演練(二)SwiftMVVM
- 第十三週週二
- 第十四周週二
- 3天學寫mvvm框架[二]:模板解析MVVM框架
- MVVM的資料持久化(二)——ROOM的使用MVVM持久化OOM
- 第八章 I/O系統(第二節1)
- 第十八章 34用過載輸入運算子函式實現字串的輸入函式字串
- Android MVVM探索(二) - DataBiding常用註解AndroidMVVM
- MVVMMVVM
- Java基礎 第二節 第十課Java
- 第十三章 sqlplus命令(二)SQL
- MVVM原理,你看了也會vue MVVMMVVMVue
- MVVM模式和在WPF中的實現(二)資料繫結MVVM模式
- MahApps.Metro的MVVM模式解析(二) 主題功能APPMVVM模式
- MVVM模式MVVM模式
- 《DNK210使用指南 -CanMV版 V1.0》第十八章 machine.Timer類實驗Mac
- MVVM原始碼 - 如何實現一個MVVM框架MVVM原始碼框架
- MVC,MVP,MVVMMVCMVPMVVM
- MVC——MVP——MVVMMVCMVPMVVM
- MVC、MVP、MVVMMVCMVPMVVM
- ios MVVM使用iOSMVVM
- 理解MVVM模式MVVM模式
- MVVM With ReactiveCocoaMVVMReact
- 手寫MVVMMVVM
- js第八章JS
- 10分鐘瞭解MVVM,實現簡易MVVMMVVM
- python小白之路:第十九章 Boosting模型(二)Python模型
- 第十八章:SpringBoot專案中使用SpringSecurity整合OAuth2設計專案API安全介面服務Spring BootGseOAuthAPI
- 【M5Stack物聯網開發】第八章 使用感測器(二)
- 第八章 多型多型
- 第八章習題