WPF /附加属性 - 请解释为什么这样做

时间:2011-06-07 19:47:00

标签: wpf dependency-properties attached-properties

请帮助我了解“ABC”值的存储位置。当我运行内存分析器时,我没有看到任何MyClass实例,实际上绑定工作,GroupBox.Header获取值ABC ...
感谢您的帮助。

<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 个答案:

答案 0 :(得分:2)

依赖项属性在内部维护字典。使用稀疏存储机制存储值。这些属性在类级别关联 - 是静态的。值ABC作为键值对存储在字典中

答案 1 :(得分:2)

以下是对其工作原理的直接解释:http://nirajrules.wordpress.com/2009/01/19/inside-dependencyobject-dependencyproperty/

基本上如Hasan Fahim所说,依赖属性存储在内部Hashtable中,基于属性名称和属性的所有者。通过将属性存储为与所有者关联,您实际上可以在HashTable中为同一类型的不同对象提供唯一的entires。这意味着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); }
    }
 }

对于版本,我可以实例化Something类型的许多实例,每个实例都包含IsEditable的“不同”值。