依赖属性是如何工作的?

3

我有一个依赖属性:

    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

当属性本身发生改变时,才会触发 changed 事件,而不是当您更改属性内的值时。举个例子,以下情况将会触发 changed 事件:

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

由于属性本身更改为另一个值,因此此示例的最后一行将触发更改事件。

但是,当您执行以下操作时:

myObject.RequestObject.SomeProperty = newPropertyValue;

因为您只是在属性内部更改了某个值,而没有更改RequestObject属性本身,所以更改事件不会触发。


1

Ronald 已经很好地解释了为什么你的方法不起作用。要使其起作用,你需要订阅你的 RequestObjectPropertyChanged 事件:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接