2

在使用 Xamarin.Forms 或 MAUI 创建项目时,我很难理解这三件事之间的区别。我知道这些是什么 -INotifyPropertyChanged是当您想在 XAML 中使用绑定时需要实现的接口,是BindableObject实现所述接口的 Xamarin.Forms 类,并且ObservableObject是在 Xamarin Community Toolkit 中找到的也实现该接口的类。我只是不太了解它们之间的区别(尤其是后两者)以及何时使用它们中的任何一个?我已经阅读了不同的教程,他们都说了不同的话——你需要自己实现接口(所以你的视图模型实现它),你的视图模型需要继承自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));
}

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

4

2 回答 2

3

我对不同的课程有一些困惑:

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

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

  • 如果您对处理 OnPropertyChanged 有一些自定义要求,您确实需要自己实现接口,但如果您只想拥有默认行为,ObservableObject 非常好。

于 2022-02-23T12:53:43.020 回答
2

我认为您的困惑源于BindableObservable之间的区别。

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

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

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

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

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

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

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

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

如果您正在寻找一些真实世界的示例,请研究MVVM 设计模式如何利用类之间的更改通信这一概念。

于 2022-02-23T12:55:21.793 回答