如果您要绑定到具有只读属性的对象,您是否仍应实施 INotifyPropertyChanged?

If you're binding to an object with read-only properties, should you still implement INotifyPropertyChanged?

在为我们正在开发的某些组件编写 API 时,我们需要公开一些只读的 POCO 对象,用户可以(并且很可能会)在他们的应用程序中为其创建数据模板,因此他们将对它们使用绑定。

现在我知道您可以绑定到直接的 POCO 对象(即不是 DependencyObject 的子类),即使它们没有实现 INotifyPropertyChanged 但当您这样做时,除非您明确标记这些绑定作为一次性,您正在创建对对象的不必要引用并可能暴露内存泄漏。

摘自this article

[...] This has 2 implications, this action causes the common language runtime (CLR) to create a strong reference from this PropertyDescriptor object to object X. The CLR also keeps a reference to the PropertyDescriptor object in a global table.

现在虽然我们可以尝试并记录到这些对象的所有绑定都应该是一次性的,但这会给消费者带来负担。我想知道是否只实施 INotifyPropertyChanged 是否有意义,即使没有任何内容专门用于防御性地解决内存泄漏问题。

换句话说,绑定到 POCO 属性 而不使用一次性,还是防御性地实施 INotifyPropertyChanged 哪个更重?

这样做有什么缺点吗?虽然不像一次性绑定那样轻量,但它仍然必须比消费者 not 将它们设置为一次性的效果更好。

如果有什么不同的话,只有一百个左右,所以非常小。

Is there any down-side to doing so?

如果有的话,缺点应该可以忽略不计。显然有一个非常小的内存损失。除此之外,您还需要在 POCO class 中定义 PropertyChanged 事件,WPF 也会订阅它,这将根据您的 CPU 架构分配额外的 4 或 8 个字节。但这并不是不实现接口的真正正当理由。

因此,如果您担心内存泄漏,并且知道并非所有绑定到您的 class' 属性的事实都会被定义为 OneTime,那么将接口实现为为此的警卫。您可能想在代码中留下评论,说明为什么在事件从未引发的情况下实现了接口。