Основываясь на ответе @ 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
}
}