2011-06-07 98 views
3

請幫我理解值「ABC」被存儲在哪裏。當我運行內存分析器時,我沒有看到MyClass的任何實例,實際上綁定工作和GroupBox.Header獲得值ABC ...
感謝您的幫助。WPF /附加屬性 - 請解釋爲什麼這個工作

<GroupBox Header="{Binding Path=(local:MyClass.Tag1), RelativeSource={RelativeSource Self}}" 
      local:MyClass.Tag1="ABC" /> 
public class MyClass 
{ 
    public static readonly DependencyProperty Tag1Property = DependencyProperty.RegisterAttached("Tag1", typeof(object), typeof(MyClass), new UIPropertyMetadata(null)); 
    public static object GetTag1(DependencyObject obj) 
    { 
     return obj.GetValue(Tag1Property); 
    } 
    public static void SetTag1(DependencyObject obj, object value) 
    { 
     obj.SetValue(Tag1Property, value); 
    } 
} 

回答

2

依賴屬性保持詞典內部。值使用稀疏存儲機制存儲。這些屬性在類級別關聯 - 是靜態的。值ABC被存儲在字典中的鍵值對

2

這裏是它如何工作的一個非常直接的解釋:http://nirajrules.wordpress.com/2009/01/19/inside-dependencyobject-dependencyproperty/

基本上爲哈桑·法希姆說,依賴屬性存儲在基於內部哈希表屬性名稱和屬性的所有者。通過將屬性存儲爲與所有者相關聯,您可以在HashTable中爲同一類型的不同對象實際具有唯一的實體。這意味着Get和Set方法不需要是靜態的。

實施例:

public class Something 
{ 
    public static readonly DependencyProperty IsEditableProperty = DependencyProperty.Register("IsEditable", typeof(Boolean), typeof(ResourceCanvas), new PropertyMetadata(true)); 

    public Boolean IsEditable 
    { 
     get { return (Boolean)this.GetValue(IsEditableProperty); } 
     set { this.SetValue(IsEditableProperty, value); } 
    } 
} 

隨着版本我可以實例化每個包含IsEditable的「不同」的值類型的東西的許多實例。

+1

謝謝JMcCarty。儘管你的回答是正確的,但我必須給予哈桑正確的答案,因爲我是第一個回答。我雖然贊成你的選票。感謝您的鏈接! – 2011-06-07 20:21:36