[英]INotifyPropertyChanged vs BindableObject vs ObservableObject in Xamarin.Forms/MAUI
在使用 Xamarin.Forms 或 MAUI 創建項目時,我很難理解這三件事之間的區別。 我知道這些是什么INotifyPropertyChanged
是一個接口,您需要在ObservableObject
中使用綁定時實現, BindableObject
是Xamarin8.88102326265988class insterments interments interments interfence insterefts in Interment andiment instement in Issentyn888888888888888888888888888888888888888888888888。 我只是不太了解它們之間的區別(尤其是后兩者)以及何時使用它們中的任何一個? 我讀過不同的教程,他們都說了不同的事情——你需要自己實現接口(所以你的視圖模型實現它),你的視圖模型需要從BindableObject
繼承,或者——如果你使用的是 Xamarin 社區工具包(你可能應該使用/正在使用) - 從ObservableObject
繼承。 但是 - 就像我說的 - 為什么你應該使用上面提到的任何解決方案而不是其他解決方案?
如果您實現INotifyPropertyChanged
接口 Visual Studio(或 ReSharper 擴展,我不確定是哪一個)會自動實現它需要的方法並添加此代碼:
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void PropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
但這會使您的代碼更長/更丑陋,所以我理解為什么您只想繼承已經實現該接口的 class。 但是為什么有些人說你應該總是自己實施呢? 自己實現和繼承一個已經實現了的class有區別嗎? 此外,如果您決定繼承 class - 為什么要使用其中一個而不是另一個? Xamarin.Forms 的文檔在這方面非常好,但它不承認 Xamarin 社區工具包和Xamarin 社區工具包文檔的存在沒有回答我的問題,也沒有說為什么你應該使用他們的ObservableObject
而不是 Xamarin.Form內置BindableObject
。
我認為您的困惑源於Bindable和Observable之間的區別。
您對INotifyPropertyChanged的看法大多是正確的。 它是價值變化的抽象概念,而不是該變化的具體實現。 它不僅用於 XAML,它還可以用於任何事情。 但那是什么意思?
系統的不同部分會關心為什么一個值會因為不同的原因而改變。 一個 class 會根據某些變化的值靜靜地將數據記錄到文本文件中,這與 class 非常不同,它會在某些變化時更新應用程序的用戶界面。
INotifyPropertyChanged 只是一種促進更改通知的機制,僅此而已。
回到ObservableObject和BindableObject之間的區別,它們只是針對不同的用例。
看看我上面鏈接的文檔。 看看 BindableObject class 上有多少方法? 請注意OnPropertyChanged如何只是 BindableObject 上的眾多方法之一,但在ObservableObject 上它是僅有的兩個方法之一?
BindableObject 用作元素的基礎 class。 例如,更改按鈕的 state 以在單擊時禁用它。 或者更新 Label 的文本值以響應某些變化。
ObservableObject 可以用作任何需要通知其他 class 值更改的對象的基礎 class。 正如您正確指出的那樣,這是為了讓您不再需要一直編寫樣板 INotifyPropertyChanged 實現。
這個主題還有很多內容,但我不想用大量信息轟炸你。
如果您正在尋找一些現實世界的示例,請研究MVVM 設計模式如何利用類的概念來相互交流更改。
我對不同的課程有些困惑:
Xamarin.Forms.BindableObject 旨在用於創建具有可綁定屬性的自定義視圖之類的東西。 它還實現了 INotifyPropertyChanged,但我認為您不應該將它用於 ViewModel。
社區工具包中的 ObservableObject 可以用作您喜歡與數據綁定一起使用的任何 class 的基礎 class,您不需要自己實現它。
如果您有一些處理 OnPropertyChanged 的自定義要求,您確實需要自己實現該接口,但如果您只想擁有默認行為,ObservableObject 就非常合適。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.