在依赖属性中获取'this'指针会改变回调

时间:2010-03-16 09:18:07

标签: c# dependency-properties

我在类中有以下依赖项属性:

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

3 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:3)

要更改的媒体资源的所有者是您的回调方法的d参数

答案 2 :(得分: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
    }
}