INotifyPropertyChanged vs. DependencyProperty

16 浏览
0 Comments

INotifyPropertyChanged vs. DependencyProperty

这个问题已经有了答案:

INotifyPropertyChanged vs. DependencyProperty in ViewModel

我需要监控属性的变化。从性能和内存使用的角度来看,实现INotifyPropertyChanged还是使用DependencyProperty哪种方法更好呢?

注意:是的,我已经阅读了其他问题INotifyPropertyChanged vs. DependencyProperty in ViewModel

admin 更改状态以发布 2023年5月24日
0
0 Comments

没关系,我在以下问题中找到了我正在寻找的答案:question

我将转载 “LBugnion” 的答案(所有的功劳都归给他)以方便您:


实现INotifyPropertyChanged与使用DependencyObjects(我将其缩写为DO使其更加轻松)和DependencyProperties(DPs)相比有许多优点:

  • 它更轻量级
  • 允许您更自由地对您的对象进行建模
  • 很容易进行序列化
  • 您可以在需要时提高事件,这在某些情况下非常有用,例如当您想将多次更改捆绑在一个UI操作中,或者当您需要触发事件时即使数据未更改(以强制重绘时...)

另一方面,在WPF中继承DOs具有以下优点:

  • 特别是适合初学者的实现更加容易。
  • 您获得回调机制(几乎)免费,允许您在属性值更改时得到通知
  • 您获得协作机制,可以定义属性的最大、最小和现有值的规则。

还有其他考虑因素,但这些是主要的。

我认为人们普遍认为DPs非常适合控件(并且即使在Silverlight中,您也可以实现具有自定义DP的CustomControl),但是对于数据对象,您最好实现INotifyPropertyChanged。

希望有所帮助,Laurent

0
0 Comments

内存使用:INotifyPropertyChanged是一个接口,所以几乎没有内存开销。 几乎没有开销是因为我假设你将编写一个OnPropertyChanged方法以及其他类中的一些事件处理程序(除非你只是想绑定到WPF),所以会有一些代码开销。

性能:DependancyProperties在内部有很多工作要做。 除非你编写了最不兼容性的OnPropertyChanged方法,否则我打赌INotifyPropertyChanged也会成为性能赢家。

除非你有一个明确的理由想要/需要DP提供的行为,否则我会选择INotifyPropertyChanged。

更新

如评论所述,绑定性能对于DP来说稍微快一些(快15-20%,但只有不到50ms的1000个绑定的差异),这是由于执行查找/连接直接属性所需的反射量。这在技术上与更新数据绑定UI元素的性能不同,这是我的评论所针对的。但这并不意味着我的赌注仍然是正确的。因此,经过一些示例和大量的.NET Reflector挖掘,看起来…没有定论。两条路径在内部都有大量的工作要做,我无法得到任何示例来显示更新性能上的明确差异。

我仍然坚持使用INotifyPropertyChanged,除非我有DP的具体需求,但至少这是一个有趣的练习,可以深入了解WPF核心。 🙂

0