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

Raz*_*ill 4 c# xamarin xamarin.forms xamarin-community-toolkit

使用 Xamarin.Forms 或 MAUI 创建项目时,我很难理解这三件事之间的区别。我知道它们是什么 -INotifyPropertyChanged是当您想要在 XAML 中使用绑定时需要实现的接口,BindableObject是实现所述接口的 Xamarin.Forms 类,也是ObservableObject在 Xamarin 社区工具包中找到的也实现该接口的类。我只是不太明白它们之间的区别(尤其是后两者)以及您什么时候会使用它们中的任何一个?我读过不同的教程,他们都说了不同的事情 - 您需要自己实现接口(以便您的视图模型实现它),您的视图模型需要继承自BindableObject,或者 - 如果您使用的是 Xamarin Community Toolkit (您可能会使用 Xamarin Community Toolkit )应该使用/正在使用) - 继承自ObservableObject. 但是 - 就像我说的 - 为什么你应该使用上面提到的任何解决方案而不是其他解决方案?

如果您实现INotifyPropertyChanged接口 Visual Studio(或 ReSharper 扩展,我不确定是哪一个)会自动实现它需要的方法并添加以下代码:

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void PropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Run Code Online (Sandbox Code Playgroud)

但它使您的代码更长/更丑,所以我理解为什么您只想从已经实现该接口的类继承。但为什么有些人说你应该自己实施呢?当您自己实现它或从已经实现它的类继承时有区别吗?另外,如果您决定从一个类继承 - 为什么要使用其中一个而不是另一个?Xamarin.Forms 的文档在这方面相当不错,但它没有承认 Xamarin 社区工具包的存在,并且Xamarin 社区工具包文档没有回答我的问题,也没有说明为什么您应该使用它们ObservableObject而不是 Xamarin。表单内置BindableObject.

小智 6

我认为您的困惑源于BindableObservable之间的差异。

您对INotifyPropertyChanged 的​​看法大多是正确的。这是价值变化的抽象概念,而不是该变化的具体实现。但它不仅仅用于 XAML,它还可以用于任何事情。但我这么说是什么意思呢?

系统的不同部分会关心值因不同原因而改变的原因。根据某些更改的值静默地将数据记录到文本文件的类与在某些更改时更新应用程序的用户界面的类非常不同。

INotifyPropertyChanged 只是一种促进更改通知的机制,仅此而已。

回到ObservableObjectBindableObject之间的区别,它们只是针对不同的用例。

查看我上面链接到的文档。看看 BindableObject 类上有多少个方法?请注意,OnPropertyChanged只是 BindableObject 上的众多方法之一,但在ObservableObject 上它是仅有的两个方法之一

BindableObject 用作​​ elements的基类。例如,更改按钮的状态以在单击按钮时将其禁用。或者更新标签的文本值以响应某些变化。

ObservableObject 可以用作任何需要通知其他类有关值更改的基类。正如您正确指出的那样,它是为了阻止您一直需要编写样板 INotifyPropertyChanged 实现。

这个主题还有很多内容,但我不想用大量信息轰炸您。

如果您正在寻找一些现实世界的示例,请研究MVVM 设计模式如何利用类的概念来相互传达更改。