Получение 'this' указателя внутри свойства зависимостей изменило обратный вызов
У меня есть следующее свойство зависимостей внутри класса:
class FooHolder
{
public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
"CurrentFoo",
typeof(Foo),
typeof(FooHandler),
new PropertyMetadata(OnCurrentFooChanged));
private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
FooHolder holder = (FooHolder) d.Property.Owner; // <- something like this
// do stuff with holder
}
}
Мне нужно получить ссылку на экземпляр класса, в котором принадлежит измененное свойство.
Это значит, что FooHolder
имеет некоторые обработчики событий, которые необходимо перехватывать/отцеплять, когда изменяется значение свойства. Измененное свойство callback должно быть статическим, но обработчик события не является.
Ответы
Ответ 1
Что-то вроде этого: (вы должны сами определить UnwireFoo() и WireFoo())
private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
FooHolder holder = (FooHolder)d; // <- something like this
holder.UnwireFoo(e.OldValue as Foo);
holder.WireFoo(e.NewValue as Foo);
}
И, конечно же, FooHolder должен наследовать от DependencyObject
Ответ 2
Владелец изменяемого свойства - это параметр d
вашего метода обратного вызова
Ответ 3
Основываясь на ответе @catalin-dicu, я добавил этот вспомогательный метод в свою библиотеку. Было немного более естественным, чтобы метод OnChanged был нестатическим и скрывал все кастинг.
static class WpfUtils
{
public static DependencyProperty RegisterDependencyPropertyWithCallback<TObject, TProperty>(string propertyName, Func<TObject, Action<TProperty, TProperty>> getOnChanged)
where TObject : DependencyObject
{
return DependencyProperty.Register(
propertyName,
typeof(TProperty),
typeof(TObject),
new PropertyMetadata(new PropertyChangedCallback((d, e) =>
getOnChanged((TObject)d)((TProperty)e.OldValue, (TProperty)e.NewValue)
))
);
}
}
Пример использования:
class FooHolder
{
public static DependencyProperty CurrentFooProperty = WpfUtils.RegisterDependencyPropertyWithCallback
<FooHolder, Foo>("CurrentFoo", x => x.OnCurrentFooChanged);
private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo)
{
// do stuff with holder
}
}