DependencyProperty

02.09.2014 at 19:41

DependencyProperty – механизм WPF, позволяющий означить свойства визуальных контролей через XAML. Многие свойства, используемые в XAML разметке – на самом деле DependencyProperty.

Использование

DependencyProperty нужны для:

  • Data Binding. Биндинг возможен только для DependencyProperty.
  • Анимаций.
  • Стилей и триггеров.
  • Они появляются в окне свойств контрола в Visual Studio

Создание DependencyProperty

Класс, содержащий DependencyProperty, должен быть унаследован от DependencyObject.
Создаем UserControl. Переходим в code behind. Пишем propdp и 2 раза нажимаем tab. Студия создает нам заготовку свойства
1
Меняем тип свойства на string
2
Меняем имя свойства на InnerText
3
Меняем класс, к которому привязано свойство на класс нашего контрола
4
Меняем значение по умолчанию на «DefaultInnerText». В итоге получаем вот такой код:

public string InnerText
{
  get { return (string)GetValue(InnerTextProperty); }
  set { SetValue(InnerTextProperty, value); }
}

public static readonly DependencyProperty InnerTextProperty =
  DependencyProperty.Register("InnerText", typeof(string), typeof(UserControl1), new PropertyMetadata("DefaultInnerText"));

В XAML теперь можно использовать добавленное свойство:
5

В коде сначала идет свойство-враппер для использования свойства в коде. Его сеттер не вызывается при означивании свойства через XAML. В XAML используется само DependencyProperty под тем именем, под которым его зарегистрировали, а не враппер. Для отслеживания изменения значения свойство нужно при регистрации указать соответствующий обработчик:

public string InnerText
{
  get { return (string)GetValue(InnerTextProperty); }
  set { SetValue(InnerTextProperty, value); }
}

public static readonly DependencyProperty InnerTextProperty =
  DependencyProperty.Register("InnerText", typeof(string), typeof(UserControl1), new PropertyMetadata("DefaultInnerText", InnerTextChanged));

private static void InnerTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
      
}

Обработчик принимает два параметра. d – экземпляр нашего контрола, e – аргументы события. Эти аргументы содержат несколько полезных свойств:

  • OldValue – старое значение свойства.
  • NewValue – новое значение свойства.
  • Property – изменяемое свойство.