2011-06-07 38 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