Получение указателя «this» внутри свойства зависимости изменило обратный вызов - PullRequest
11 голосов
/ 16 марта 2010

У меня есть следующее свойство зависимости внутри класса:

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 ]

17 голосов
/ 16 марта 2010

Примерно так: (вам придется определить 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

3 голосов
/ 10 января 2015

Основываясь на ответе @ 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
    }
}
3 голосов
/ 16 марта 2010

Владелец изменяемого свойства - это параметр d вашего метода обратного вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...