我用一个DP创建了一个用户控件。 现在我在我的页面中使用该UC 5次,我的问题是,DP是一个静态属性,所以它只会创建一个实例。现在这个值将如何保存5个不同的控件?
答案 0 :(得分:9)
每个类型都会创建依赖项属性,并且可以根据需要进行自定义。因此,如果您的屏幕有20个按钮,那么您所占用的属性的存储空间就像一个按钮一样好。
DependencyObject 维护两个HashTable成员:
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
依赖项属性值。