Существует ли механизм уведомления об изменении свойства зависимости?

В приложении Silverlight я пытаюсь выяснить, когда изменилось свойство пользовательского элемента управления. Меня интересует одно конкретное свойство DependencyProperty, но, к сожалению, сам элемент управления не реализует INotifyPropertyChanged.

Есть ли другой способ определить, изменилось ли значение?


person Mark Ingram    schedule 27.10.2008    source источник


Ответы (4)


В WPF у вас есть DependencyPropertyDescriptor.AddValueChanged, но, к сожалению, в Silverlight такого нет. Так что ответ нет.

Возможно, если вы объясните, что вы пытаетесь сделать, вы сможете обойти ситуацию или использовать привязки.

person asterite    schedule 27.10.2008

Ты сможешь. По крайней мере, я сделал. Все равно надо смотреть плюсы и минусы.

 /// Listen for change of the dependency property
    public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
    {

        //Bind to a depedency property
        Binding b = new Binding(propertyName) { Source = element };
        var prop = System.Windows.DependencyProperty.RegisterAttached(
            "ListenAttached"+propertyName,
            typeof(object),
            typeof(UserControl),
            new System.Windows.PropertyMetadata(callback));

        element.SetBinding(prop, b);
    }

И теперь вы можете вызвать RegisterForNotification, чтобы зарегистрироваться для получения уведомления об изменении свойства элемента, например .

RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed"));
            RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed"));

См. мой пост здесь, на том же http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html

person amazedsaint    schedule 02.12.2009
comment
Ты мужчина! Я боролся с этим несколько часов, прежде чем нашел ваш ответ. - person Steve Wortham; 29.08.2010
comment
Вызывает ли это какие-либо проблемы со сборкой мусора? Будет ли продлен срок службы element? - person kpozin; 16.09.2010

Как сообщил Джон Галлоуэй в другой ветке, вы можете использовать что-то вроде WeakReference, чтобы обернуть интересующие вас свойства и перерегистрировать их в своем собственном классе. Это код WPF, но концепция не зависит от DependencyPropertyDescriptor.

Ссылка на статью

person Daniel Crenna    schedule 03.11.2008

Проверьте следующую ссылку. В нем показано, как обойти проблему в Silverlight, где у вас нет DependencyPropertyDescriptor.AddValueChanged.

http://themechanicalbride.blogspot.com/2008/10/building-observable-model-in.html

person Community    schedule 18.03.2009