代码之家  ›  专栏  ›  技术社区  ›  Gishu

为什么.NET WPF DependencyProperties必须是类的静态成员

  •  4
  • Gishu  · 技术社区  · 16 年前

    现在学习WPF。今天发现了一些新的.NET依赖属性。他们带来的是

    • 支持回调(验证、更改等)
    • 财产继承
    • 附加属性

    在其他中。

    但我的问题是,为什么需要在包含类中将它们声明为静态的呢?建议的方法是为它们添加实例“wrapper”属性。为什么?

    编辑: @马特,但这是否也要求在实例之间共享属性值——当然,除非它是派生值?

    3 回复  |  直到 12 年前
        1
  •  2
  •   aku    16 年前

    我看到了这一要求背后的两个原因:

    1. 同一个dp不能注册两次。为了遵守这个约束,您应该使用静态变量,它将只初始化一次,因此您将只注册一次dp。
    2. dp应该在创建的任何类(使用该db)实例之前注册。
        2
  •  7
  •   akjoshi HCP    12 年前

    依赖属性是静态的,这是因为WPF中的一个键优化:WPF中的许多控件都有数十个属性,如果不是数百个属性的话。这些类中的大多数属性都设置为其默认值。如果dp是实例属性,则需要为您创建的每个对象中的每个属性分配内存。由于dp是静态的,所以wpf可以更有效地管理每个属性的内存使用。

    为您注册的任何DP提供默认值的原因是,无论您创建的包含该属性的对象有多少,当属性设置为默认值时,WPF都会注意不要为该属性分配额外的内存。

        3
  •  5
  •   Matt Hamilton    16 年前

    我认为需要依赖属性的静态实例的原因实际上是因为它们是这样设计的。静态位包含所有的属性元数据——它的默认值、它的所有者类型(如果它是一个附加的属性的话就很方便)等,以及当它改变时的回调方法——诸如此类。将这些东西静态地存储在类的所有实例中而不是每个实例中是有意义的。