DependencyProperty
DependencyProperty – механизм WPF, позволяющий означить свойства визуальных контролей через XAML. Многие свойства, используемые в XAML разметке – на самом деле DependencyProperty.
Использование
DependencyProperty нужны для:
- Data Binding. Биндинг возможен только для DependencyProperty.
- Анимаций.
- Стилей и триггеров.
- Они появляются в окне свойств контрола в Visual Studio
Создание DependencyProperty
Класс, содержащий DependencyProperty, должен быть унаследован от DependencyObject.
Создаем UserControl. Переходим в code behind. Пишем propdp и 2 раза нажимаем tab. Студия создает нам заготовку свойства
Меняем тип свойства на string
Меняем имя свойства на InnerText
Меняем класс, к которому привязано свойство на класс нашего контрола
Меняем значение по умолчанию на «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 теперь можно использовать добавленное свойство:
В коде сначала идет свойство-враппер для использования свойства в коде. Его сеттер не вызывается при означивании свойства через 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 – изменяемое свойство.