2

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

ответ

9

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

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

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

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

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

частные свойства Hashtable = new Hashtable();

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

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

Так,

  • DP не имеет никакого значения до того времени он изменился.

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

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

Вы также можете увидеть его здесь на моем блоге: How Dependency Property holds value

1

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

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

Основной образец для определения 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.