2012-02-27 73 views
2

我創建了一個DP的用戶控件。 現在我在我的頁面中使用該UC 5次,我的問題是,DP是一個靜態屬性,因此它只會創建一個實例。現在該值如何保持5個不同的控件?依賴屬性如何保持值

回答

9

依賴屬性按類型創建,可根據需要自定義。所以,如果你的屏幕有,比方說,20個按鈕你的存儲空間佔用的屬性是一樣好的按鈕。

的DependencyObject維持兩個哈希表成員:

  • 一個靜態

私有靜態Hashtable的_staticProperties =新的Hashtable();

  • 另一個非靜態。

private Hashtable properties = new Hashtable();

靜態成員存儲DP(默認值爲所有類型)和非靜態成員存儲值已更改的默認值。

當你調用你的dp的SetValue方法時,你基本上是在你的非靜態HashTable中添加一個項目。當調用GetValue時,DependencyObject首先檢查非靜態HashTable是否有鍵;如果找到則返回值,否則返回從靜態成員的值(這是默認值)

所以,

  • DP不成立,直到它改變時間的任何值。

  • DP是靜態的,因此您的應用可以觀察它們的值;這就是爲什麼你註冊一個DP而不是實例化。

  • DP保持在的DependencyObject類中聲明一個哈希表價值,你需要通過車主的類型,而註冊一個。

您還可以在這裏看到它在我的博客:How Dependency Property holds value

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依賴項屬性值。