WPF / Attached Properties - Пожалуйста, объясните, почему это работает - PullRequest
3 голосов
/ 07 июня 2011

Пожалуйста, помогите мне понять, где хранится значение "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 ]

2 голосов
/ 08 июня 2011

Вот довольно простое объяснение того, как это работает: http://nirajrules.wordpress.com/2009/01/19/inside-dependencyobject-dependencyproperty/

По сути, как сказал Хасан Фахим, свойства зависимостей хранятся во внутренней 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.

2 голосов
/ 07 июня 2011

Свойства зависимостей поддерживают словарь внутри. Значения хранятся с использованием механизма разреженного хранения. Эти свойства связаны на уровне класса и являются статичными. Значение ABC хранится в словаре в виде пар ключ-значение

...