簡體   English   中英

Xamarin.Forms/MAUI 中的 INotifyPropertyChanged vs BindableObject vs ObservableObject

[英]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

我認為您的困惑源於BindableObservable之間的區別。

您對INotifyPropertyChanged的看法大多是正確的。 它是價值變化的抽象概念,而不是該變化的具體實現。 它不僅用於 XAML,它還可以用於任何事情。 但那是什么意思?

系統的不同部分會關心為什么一個值會因為不同的原因而改變。 一個 class 會根據某些變化的值靜靜地將數據記錄到文本文件中,這與 class 非常不同,它會在某些變化時更新應用程序的用戶界面。

INotifyPropertyChanged 只是一種促進更改通知的機制,僅此而已。

回到ObservableObjectBindableObject之間的區別,它們只是針對不同的用例。

看看我上面鏈接的文檔。 看看 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM