【问题标题】:WPF/Attached Properties - Please explain why this worksWPF/附加属性 - 请解释为什么这样做
【发布时间】:2011-06-07 19:47:00
【问题描述】:

请帮助我了解值“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);
    }
}

【问题讨论】:

    标签: wpf dependency-properties attached-properties


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      本质上正如 Hasan Fahim 所说,依赖属性存储在基于属性名称和属性所有者的内部 Hashtable 中。通过将属性存储为与所有者相关联,您实际上可以在 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); }
          }
       }
      

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

      【讨论】:

      • 谢谢 JMcCarty。尽管您的回答是正确的,但我不得不将正确的答案授予哈桑,因为他是第一个回答的人。不过,我对你的投了赞成票。感谢您的链接!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多