在依赖属性中获取’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有一些事件处理程序需要在属性值更改时挂钩/取消挂钩。 属性更改回调必须是静态的,但事件处理程序不是。

这样的事情:(你必须自己定义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必须inheritance自DependencyObject

要更改的属性的所有者是回调方法的d参数

根据@ catalin-dicu的回答,我将这个辅助方法添加到我的库中。 让OnChanged方法非静态并隐藏所有的转换感觉更自然一点。

 static class WpfUtils { public static DependencyProperty RegisterDependencyPropertyWithCallback(string propertyName, Func> 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 ("CurrentFoo", x => x.OnCurrentFooChanged); private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo) { // do stuff with holder } }