【发布时间】:2019-01-17 16:53:34
【问题描述】:
在为我们正在开发的某些组件编写 API 时,我们需要公开一些只读 POCO 对象,用户可以(并且很可能会)在他们的应用程序中为其创建数据模板,因此他们将使用绑定到它们。
现在我知道你可以绑定到直接 POCO 对象(即不是DependencyObject 的子类),即使它们没有实现INotifyPropertyChanged,但是当你这样做时,除非你明确地将这些绑定标记为一次性,否则你'正在创建对您的对象的不必要引用并可能暴露内存泄漏。
摘自this article:
[...] 这有 2 个含义,此操作会导致公共语言运行时 (CLR) 创建从该 PropertyDescriptor 对象到对象 X 的强引用。CLR 还在全局表中保留对 PropertyDescriptor 对象的引用.
现在,虽然我们可以尝试记录对这些对象的所有绑定都应该是一次性的,但这会给消费者带来负担。我想知道无论如何只实现INotifyPropertyChanged 是否有意义,尽管没有任何改变专门用于防御性地解决内存泄漏。
换句话说,哪个更重,绑定到 POCO 属性而不使用一次性,还是防御性地实现 INotifyPropertyChanged?
这样做有什么坏处吗?虽然不像一次性绑定那样轻量级,但它仍然必须比消费者不将它们设置为一次性所产生的效果更好。
如果有什么不同,那么只有一百个左右,所以这是一个非常小的集合。
【问题讨论】:
-
我很欣赏它们可能不那么优雅,但您可能需要考虑实现只读依赖属性。这样就不需要实现
INotifyPropertyChanged -
实现 INotifyPropertyChanged 然后从不触发其 PropertyChanged 事件有什么好处? CLR 将仍然创建并保留对 PropertyDescriptor 的引用。所以你的问题的答案很明显:“不,你不应该”。
-
@Bijington,你不能在 POCO 上实现依赖属性。它必须是
DependencyObject的子类,如果是,则此问题不适用。 -
@Clemens,是的,还有一个参考,但它的成本比不实现接口的对象要小得多,因此我的问题是。
-
我不明白,不管有没有 INPC,都会保留参考。那么好处在哪里呢?
标签: wpf data-binding binding poco inotifypropertychanged