Как свойство зависимостей содержит значение - PullRequest
2 голосов
/ 27 февраля 2012

Я создал пользовательский элемент управления с одним DP. Теперь я использую этот UC на моей странице с 5 разами, и мой вопрос, DP является статическим свойством, поэтому он будет создавать только один экземпляр. Теперь, как значение будет храниться для 5 различных элементов управления?

Ответы [ 2 ]

9 голосов
/ 27 февраля 2012

Свойства зависимостей создаются для каждого типа и могут быть настроены при необходимости.Так что, если на вашем экране, скажем, 20 кнопок, пространство для хранения занятых свойств ничем не отличается от одной кнопки.

DependencyObject поддерживает два члена HashTable:

  • один статический

частный статический Hashtable _staticProperties = new Hashtable ();

  • другой нестатический.

private Hashtable properties = new Hashtable ();

Статический член хранит значения DP по умолчанию (только одно для всех типов), а нестатический член хранит значения, которые были изменены.

Когда вы вызываете метод SetValue вашего dp, вы в основном добавляете элемент в свой нестатический HashTable.И когда GetValue вызывается, DependencyObject сначала проверяет, есть ли у нестатического HashTable ключ;если найдено, то возвращает значение, иначе возвращает значение из статического члена (который является значением по умолчанию)

Итак,

  • DP не удерживает никакого значения до времениэто изменилось

  • DP статичны, так что ваше приложение может наблюдать их значения;вот почему вы регистрируете DP вместо создания экземпляра.

  • DP хранит значение в HashTable , объявленном в DependencyObject , вам нужно передатьтип владельца при регистрации.

Вы также можете увидеть его здесь, в моем блоге: Как свойство зависимости зависит от значения

1 голос
/ 27 февраля 2012

Когда вы объявляете DependencyProperty, существует только одно определение свойства, и поэтому вы делаете определение с использованием статического члена.

Однако каждый объект, имеющий значение для DependencyProperty, получает свое собственное значение свойства. Обычный шаблон для создания DependencyProperty в классе - создание установщика и получателя свойства, и это свойство не является статическим.

Основной шаблон для определения DependencyProperty таков:

public class MyObject : DependencyObject {

  public static readonly DependencyProperty SomethingProperty =
    DependencyProperty.Register(
      "Something",
      typeof(String),
      typeof(MyObject),
      new PropertyMetadata(default(String))
    );

  public String Something {
    get { return (String) GetValue(SomethingProperty); }
    set { SetValue(SomethingProperty, value); }
  }

}

Обратите внимание, что определение свойства является статическим, но не фактическим свойством.

Каждый экземпляр MyObject будет иметь свое собственное значение свойства зависимостей Something.

...