среда, 8 июля 2015 г.

Подписаться на изменение DependecyProperty

Часто бывает, что есть некий потомок DependencyObject, у него есть DependencyProperty, а вот события сообщающего о том, что свойство изменилось нет. Я с такой ситуацией столкнулся при попытках отследить изменение актуальной ширины DataGridColumn. Ну и под катом, как это все можно провернуть.

Для примера, я воспользуюсь вот таким классом:
class MyClass : DependencyObject
{
    public int MyProperty
    {
        get { return (int)GetValue(MyPropertyProperty); }
        set { SetValue(MyPropertyProperty, value); }
    }
 
    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.Register("MyProperty"typeof(int), typeof(MyClass), new PropertyMetadata(0));
}
Ну и как мы можем узнать об изменении этого свойства? До очень просто, вот так:
static void Main(string[] args)
{
    MyClass m = new MyClass();
    m.MyProperty = 10; // До подписывания
    PropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(MyClass.MyPropertyProperty, typeof(MyClass));
    descriptor.AddValueChanged(m, new EventHandler((sender, e) => Console.WriteLine(((MyClass)sender).MyProperty)));
    m.MyProperty = 20;
    Console.ReadKey();
}
Ну и вот так это выглядит:
Первое изменение свойства прошло тихонечко, а на второе уже сработал вывод. 

Комментариев нет:

Отправить комментарий