Как работает Dependency Property? - PullRequest
       0

Как работает Dependency Property?

3 голосов
/ 13 октября 2010

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

    public static DependencyProperty RequestObjectProperty = DependencyProperty.Register("RequestObject", typeof(RegistrationCardSearch), typeof(RegCardSearchForm),new UIPropertyMetadata(Changed));

    private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MessageBox.Show("Property Changed!!!");
    }
    public RegistrationCardSearch RequestObject
    {
        get
        {
            return (RegistrationCardSearch)GetValue(RequestObjectProperty);
        }
        set
        {
            SetValue(RequestObjectProperty, value);
        }
    }

и метод " Changed ", который должен срабатывать при изменении моего свойства зависимости.Мой тип недвижимости RegistrashionCardSearch (класс).Когда я изменяю значения свойств класса в свойстве зависимостей, свойство изменяет обратный вызов не запускается.Зачем??Мой класс RegistrashionCardSearch реализует интерфейс INotifePropertyChanged

Ответы [ 2 ]

3 голосов
/ 13 октября 2010

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

var requestObject = myObject.RequestObject;
myObject.RequestObject = new RegistrationCardSearch() { ... };

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

Однако, когда вы делаете что-то вроде этого:

myObject.RequestObject.SomeProperty = newPropertyValue;

измененное событие не сработает, потому что вы не изменили само свойство RequestObject, только какое-то значение внутри свойства.

1 голос
/ 13 октября 2010

Рональд уже хорошо объяснил, почему ваш подход не работает.Чтобы заставить его работать, вам нужно подписаться на PropertyChanged событие вашего RequestObject:

private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var form = (RegCardSearchForm)d;

    if (e.OldValue != null)
        ((RegistrationCardSearch)e.OldValue).PropertyChanged -= form.RequestObject_PropertyChanged;
    if (e.NewValue != null)
        ((RegistrationCardSearch)e.NewValue).PropertyChanged += form.RequestObject_PropertyChanged;
}

private void RequestObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    MessageBox.Show("Property " + e.PropertyName + " changed!");
}
...