【问题标题】:Non-static dependency properties非静态依赖属性
【发布时间】:2010-09-07 16:40:21
【问题描述】:

我有什么理由可以(或不应该)将依赖属性声明为非静态的?

我需要创建一个具有双向可绑定属性的接口。 INotifyPropertyChanged 在接收端似乎有点麻烦,因为它依赖于字符串标识符。

【问题讨论】:

    标签: wpf


    【解决方案1】:

    我有什么理由可以(或不应该)将依赖属性声明为非静态的吗?

    是的。

    WPF 中的依赖属性机制使用按类型指定的存储机制,而不是按实例指定的存储机制。 DPs 的设计依赖于它们是静态定义的,而不是每个实例。如果您在实例上定义它们,它们将无法正常工作。

    这样做的部分原因是为了允许继承属性,但也允许您在对象上指定大量属性,而无需为每个实例使用大量内存。

    如果您想创建一个具有双向可绑定属性的界面,通常您希望为您的类使用 INotifyPropertyChanged,并使用用户界面元素上的依赖属性来处理绑定。 INotifyPropertyChanged 是正确的机制。如果主要抱怨的是字符串标识符,您可以work around them using expression trees

    【讨论】:

    • 感谢您的回复,我不知道DP在内部是如何实现的。一个属性是 DP 并同时实现 INotifyPropertyChanged 是否可以(用于 XAML UI 的 DP 和另一个通过接口公开)?
    • @commanderz:是的,但通常情况下,您将在 UI 元素上设置 DP,在“模型”对象上设置 INPC,这应该是 UI 的 DataContext。您可以将两者放在同一个对象上,但这通常不是一个好主意,因为最好将您的关注点分开。
    • @commanderz:尽量将应用程序逻辑(实现 INPC)与 UI(使用 DP)分开
    【解决方案2】:

    DependencyProperty 字段本身需要声明为静态,包含 GetValue/SetValue 调用的包装器属性则不需要。

    依赖属性内置了更改通知,因此您不需要做任何额外的事情来获得它。要使您的属性上的 Bindings 默认为 Mode=TwoWay,请将 FrameworkPropertyMetadata 传递给 Register 方法,并在选项中使用 FrameworkPropertyMetadataOptions.BindsToWayByDefault 标志。

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 2011-11-16
      • 1970-01-01
      • 2021-08-20
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 2011-08-19
      • 2011-02-23
      相关资源
      最近更新 更多