【问题标题】:What is a dependency property?什么是依赖属性?
【发布时间】:2010-10-11 15:58:19
【问题描述】:

.Net 中的依赖属性是什么(尤其是在 WPF 上下文中)。和普通属性有什么区别?

【问题讨论】:

    标签: .net workflow-foundation dependency-properties


    【解决方案1】:

    http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ 很好地解释了 WF 和 WPF 上下文中的依赖属性。

    摘录:

    关键点——解决依赖属性的价值

    与任何属性一样,依赖属性的最终目标是管理状态。但与普通 .Net 属性不同的是,本地属性值不存储在实例变量中。

    相反,依赖属性在依赖属性框架中注册,并且底层属性值被解析——这意味着该值由依赖属性框架根据属性注册定义的规则确定。

    【讨论】:

      【解决方案2】:

      依赖属性是派生自 DependencyObject 的类的属性,它们的特殊之处在于它们不是简单地使用支持字段来存储它们的值,而是在 DependencyObject 上使用一些辅助方法。

      它们最棒的地方在于,它们内置了所有数据绑定管道。如果您将某些内容绑定到它们,它们会在更改时通知它。

      【讨论】:

      • 这仍然很少告诉我依赖属性可以做什么,或者它为什么存在。您没有提及它们最有价值的属性,即元素树上的值解析。
      • 嗨@MattHamilton 谢谢你的回答 - 但你说的“他们在 DependencyObject 上使用了一些辅助方法”是什么意思?
      • @BKSpureon DependencyObject 有一些方法,如“SetValue”和“GetValue”,您可以调用它们来保存/读取依赖属性的值,而不是使用支持字段。
      【解决方案3】:

      我发现唯一有用且写得很好的解释是:http://www.wpftutorial.net/dependencyproperties.html

      基本上,DependencyProperties 与常规属性的不同之处在于它们不仅仅是类中字段的设置器/获取器,而且它们在运行时动态地检索它们的实际值。 DPs 的SetValue() 方法非常简单,它将属性的本地值设置为您给它的值。但是,当您尝试从 DependencyProperty 中 GetValue() 时,它会首先查找本地值,如果不存在(这在 DependencyProperties 中与常规属性不同),它将继续沿着逻辑 UI 树向上直到找到这样的值.如果框架在没有找到任何本地值的情况下到达树的顶部,它将使用预定义的默认值作为属性的值。

      此方法允许 DependencyProperties 比常规属性消耗更少的内存,因为只有用户明确设置的值才会存储在本地。

      而且,如上所述,DependencyProperties 还允许我们在 XAML 代码中绑定到它们并在它们上设置触发器,这在常规属性上是不允许的。

      我希望我已经设法消除了一些模糊性:)

      【讨论】:

      • 什么是“附加属性”?
      • 附加属性是不属于正在声明的当前项但影响另一个对象的属性。例如:Button 上的 Grid.Row="1" 会将其设置为父 Grid 上的第 2 行(由于行是从零开始的),但 Row DependencyProperty 属于 Grid对象。
      • 当您说DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed 时,您的意思是在 XAML 中绑定和设置触发器还是不允许仅设置触发器。感谢您的跟进和帮助让事情变得更清晰!
      • @Paul-SebastianManole DataTriggers 也适用于常规属性。假设您有一个值为 0 的 Value 属性(不是 DP),并且您希望您的视图在 Value 更改为 1 时执行某些操作。您可以使用 DataTrigger 并设置 Binding={Binding Path=Value, Value=1}
      猜你喜欢
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      相关资源
      最近更新 更多