Xamarin 中的 INotifyPropertyChanged 对比 BindableObject 对比 ObservableObject。Forms/MAUI

INotifyPropertyChanged vs BindableObject vs ObservableObject in Xamarin.Forms/MAUI

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

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

public event PropertyChangedEventHandler PropertyChanged;

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

但它使您的代码 longer/uglier,所以我理解您为什么只想继承已经实现该接口的 class。但是为什么有些人说你应该总是自己实施呢?当您自己实现它或从已经实现它的 class 继承时有区别吗?此外,如果您决定继承 class - 为什么要使用其中一个而不是另一个? The documentation of Xamarin.Forms is quite good in this regard, but it doesn't acknowledge the existence of Xamarin Community Toolkit and the Xamarin Community Toolkit documentation doesn't answer my question 并没有说明为什么你应该使用他们的 ObservableObject 而不是 Xamarin.Form 的内置 BindableObject.

我对不同的 class 感到有些困惑:

  • Xamarin.Forms.BindableObject 旨在用于创建具有可绑定属性的自定义视图之类的东西。它还实现了 INotifyPropertyChanged,但我认为您不应该将它用于 ViewModel。

  • 社区工具包中的 ObservableObject 可以用作任何 class 的基础 class 您喜欢与数据绑定一起使用,您不需要实现它你自己。

  • 如果您有一些处理 OnPropertyChanged 的​​自定义要求,您确实需要自己实现接口,但如果您只想拥有默认行为,ObservableObject 就完全可以了。

我认为您的困惑源于 BindableObservable.

之间的区别

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

系统的不同部分会关心为什么一个值会因为不同的原因而改变。 class 会根据某些变化的值静静地将数据记录到文本文件,这与 class 在某些变化时更新应用程序的用户界面有很大不同。

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

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

看看我上面链接的文档。查看 BindableObject class 上存在多少方法?注意 OnPropertyChanged is just one of many methods on the BindableObject, but on ObservableObject it's one of only two?

BindableObject 用作​​ 元素 的基础 class。例如,更改按钮的状态以在单击时禁用它。或者更新 Label 的文本值以响应变化。

ObservableObject 可以用作基础class 任何需要通知其他class值变化的东西。正如您正确指出的那样,这是为了让您不再需要一直编写样板 INotifyPropertyChanged 实现。

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

如果您正在寻找一些现实世界的示例,请研究 MVVM design pattern 如何利用 classes 的概念来相互交流更改。