创建依赖属性有什么缺点?

时间:2010-12-18 11:43:08

标签: c# wpf

这里说:

http://msdn.microsoft.com/en-us/library/ms753358.aspx

  

有时候,用私人领域支持你的财产的典型技术就足够了。

     

但是,只要您希望属性支持以下一个或多个WPF功能,就应该将属性实现为依赖属性...

如果我查看所有功能,他们是非常明显的需求,所以我不能真正看到我什么时候不应该创建依赖属性。

因此,如果我系统地创建一个依赖属性而不是仅仅创建一个私有字段会有什么缺点呢?

3 个答案:

答案 0 :(得分:3)

实际上有一些缺点:

  • 创建依赖项属性比私有字段支持的属性更详细。
  • 使用Dependency属性时,数据存储在Dictionary中。它具有一些性能影响:访问查找在运行时完成,转换也是如此,并且装箱/取消装箱将发生,因为每个依赖属性值都存储为对象。此外,所有这些功能都是以每次访问(读取或写入)为代价支付的价格(性能价格)。将引发事件(如PropertyChanged)将根据您的DP配置执行验证...

  • 您的类必须继承自DependencyObject

这是我愿意在需要这些功能时付出的代价。但在很多情况下不需要它们=>适当时使用DP,在其他地方使用经典的私人领域。

有些情况下您会后悔某个属性不可绑定:如果发生这种情况,请将该字段替换为引擎盖下的DP实现。

答案 1 :(得分:1)

这取决于你需要什么。 例如,如果你需要绑定,你必须创建一个DependencyProperty。 如果你必须使用不与图形界面“通信”的数据使用DependencyProperty是没有价值且性能较低的,因为你不需要绑定,动画等。

  

依赖项属性的目的是提供一种基于其他输入的值计算属性值的方法。这些其他输入可能包括系统属性,例如主题和用户首选项,即时属性确定机制(如数据绑定和动画/故事板),多用途模板(如资源和样式)或通过父子关系知道的值元素树中的其他元素。此外,可以实现依赖项属性以提供自包含验证,默认值,监视对其他属性的更改的回调,以及可以基于潜在运行时信息强制属性值的系统。派生类还可以通过覆盖依赖项属性元数据来更改现有属性的某些特定特征,而不是覆盖现有属性的实际实现或创建新属性。

答案 2 :(得分:1)

只有在制作/修改新的WPF控件时才应使用DP。开销太多而无法用作VM上的属性(并使VM依赖于WPF)。对于正常使用,您应该实现INotifyPropertyChanged