依赖属性如何保持价值

时间:2012-02-27 10:10:19

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

我用一个DP创建了一个用户控件。 现在我在我的页面中使用该UC 5次,我的问题是,DP是一个静态属性,所以它只会创建一个实例。现在这个值将如何保存5个不同的控件?

2 个答案:

答案 0 :(得分:9)

每个类型都会创建依赖项属性,并且可以根据需要进行自定义。因此,如果您的屏幕有20个按钮,那么您所占用的属性的存储空间就像一个按钮一样好。

DependencyObject 维护两个HashTable成员:

  • one static
  

private static Hashtable _staticProperties = new Hashtable();

  • 另一种非静态。
  

private Hashtable properties = new Hashtable();

静态成员存储DP的默认值(对于所有类型只有一个)和非静态成员存储已更改的值。

当你调用dp的SetValue方法时,你基本上是在非静态HashTable中添加一个项目。当调用GetValue时,DependencyObject首先检查非静态HashTable是否具有密钥;如果找到然后返回值,否则它返回静态成员的值(这是默认值)

所以,

  • DP在更改之前不会保留任何值。

  • DP是静态的,以便您的应用可以观察其值;这就是你注册DP而不是实例化的原因。

  • DP在 DependencyObject 类中声明的 HashTable 中保存值,您需要在注册一个时传递所有者的类型。

您也可以在我的博客上看到它:How Dependency Property holds value

答案 1 :(得分:1)

当您声明DependencyProperty时,该属性只有一个定义,这就是您使用静态成员进行定义的原因。

但是,具有DependencyProperty值的每个对象都有自己的属性值。在类上创建DependencyProperty的常规模式是创建属性setter和getter,并且此属性不是静态的。

定义DependencyProperty的基本模式是:

public class MyObject : DependencyObject {

  public static readonly DependencyProperty SomethingProperty =
    DependencyProperty.Register(
      "Something",
      typeof(String),
      typeof(MyObject),
      new PropertyMetadata(default(String))
    );

  public String Something {
    get { return (String) GetValue(SomethingProperty); }
    set { SetValue(SomethingProperty, value); }
  }

}

请注意,属性定义是静态的,但不是实际属性。

MyObject的每个实例都有自己的Something依赖项属性值。