Getting 'this' pointer inside dependency property changed callback

后端 未结 3 984
温柔的废话
温柔的废话 2021-01-11 14:44

I have the following dependency property inside a class:

class FooHolder
{
    public static DependencyProperty CurrentFooProperty = DependencyProperty.Regis         


        
相关标签:
3条回答
  • 2021-01-11 14:57

    Based on @catalin-dicu 's answer, I added this helper method to my library. It felt a bit more natural to have the OnChanged method be non-static and to hide all the casting.

    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)
                ))
            );
        }
    }
    

    Usage example:

    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
        }
    }
    
    0 讨论(0)
  • 2021-01-11 15:00

    Something like this : (you'll have to define UnwireFoo() and WireFoo() yourself)

    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);
    }
    

    And, of course, FooHolder must inherit from DependencyObject

    0 讨论(0)
  • 2021-01-11 15:10

    The owner of the property being changed is the d parameter of your callback method

    0 讨论(0)
提交回复
热议问题