【问题标题】:Why dependency properties in WPF has to be Static为什么 WPF 中的依赖属性必须是静态的
【发布时间】:2013-10-26 19:30:18
【问题描述】:

为什么依赖属性必须是静态的?

我已经看到这里的一些帖子中已经提出了这个问题,但我无法正确理解它。

如果有人也能用一个小sn-p帮助我理解,那就太好了。

【问题讨论】:

  • 上述问题的答案中的解释相当基础,请阅读基础知识,然后我们可以讨论约束是否有效。
  • @M.Babcock:这就是我在描述中所说的,我已经看到了很少的解释,但并不全面。在我在这里写我的问题之前,我已经看到了你提供的链接,而且我也看到了这个stackoverflow.com/questions/2989431/…
  • 如果有人可以帮助我以更好、更全面的方式理解它,我会在并行等待的同时尽可能阅读此内容。

标签: c# .net wpf c#-4.0 dependency-properties


【解决方案1】:

这里的神奇之处在于,DependencyProperty 的声明是 static 而不是它的 value(即内存存储)。您使用static 关键字添加的声明只是特定DependencyObjectDependencyProperty 的标识符(键)。由于 DependencyObject 的所有实例都可以使用相同的标识符/键来标识属性值,因此将其设为 static 是有意义的。

另一方面,当我们通过在DependancyObject 实例上调用SetValue 来设置DependancyProperty 的值时,调用SetValue 的DependancyObject 的每个实例都将存储其属性的本地值.这由DependancyObject 类在内部处理,该类维护某种Dictionary,它具有DependancyProperty 标识符和本地值之间的映射。

【讨论】:

  • 非常感谢 Nit,这对我帮助很大。我也在寻找一些好的sn-p,我可以更好地理解它。
  • 我不明白这一行 - “相同的标识符将由该依赖对象的所有实例共享”如果你能解释我会很棒,我是编程新手:(
  • 你可以把它作为字典的keyvaluepair的key,DependancyObject必须存储依赖属性的值。由于每个实例可以具有不同的属性值,但是要识别该值,我们不需要不同的键,因为每个实例的值将对应于相同的键..因此它是静态的
  • 非常感谢 Nit,这有助于我更好地理解它。干杯
  • 很高兴它有帮助..如果您想详细阅读依赖属性的值解析.. 这是一个很好的视觉表示wpftutorial.net/DependencyProperties.html
【解决方案2】:

DependencyProperty 必须是静态(类级别),因为当我们创建具有该属性的类的多个对象并希望引用该属性的默认值时,该值必须来自该静态DependencyProperty 的实例。因此,我们类的所有实例的默认值都是相同的,并且系统不会为该类的每个实例上的 DependencyProperty 保留内存。 这样可以减少内存占用。

现在下一个问题出现了,如果我们为类的对象显式设置 DependencyProperty 的值会怎样。(通过代码、动画或样式)

在这种情况下,DependencyObject 出现了。任何具有 DependencyProperty 的类都必须派生自 DependencyObject 类(WPF 特定类,它维护一个名为 EffectiveValues 的集合)。当用户在类的对象上显式地设置 DependencyProperty 的值(通过代码或动画或样式),该值存储在位于 DependencyObject 类中的 EffectiveValues 集合中和在那里保留内存。

【讨论】:

  • 很好的答案;但是,DependencyObject 不是特定于 WPF 的类——它在 Silverlight 和 WinRT 中也可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
相关资源
最近更新 更多