Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖属性如何工作?_C#_Wpf_Dependency Properties - Fatal编程技术网

C# 依赖属性如何工作?

C# 依赖属性如何工作?,c#,wpf,dependency-properties,C#,Wpf,Dependency Properties,我有下一个依赖属性: public static DependencyProperty RequestObjectProperty = DependencyProperty.Register("RequestObject", typeof(RegistrationCardSearch), typeof(RegCardSearchForm),new UIPropertyMetadata(Changed)); private static void Changed(Dependen

我有下一个依赖属性:

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

和“已更改”“方法,当我的依赖项属性更改时必须触发该方法。我的属性类型是RegistrashionCardSearch(类)。当我在dependency属性中更改类的属性值时,不会触发属性更改回调。为什么?My RegistrashionCardSearch类实现InotifyPropertyChanged接口

仅当属性本身更改时,而不是当您更改此属性内的值时,才会触发更改事件。要给出导致已更改事件触发的示例,请执行以下操作:

var requestObject = myObject.RequestObject;
myObject.RequestObject = new RegistrationCardSearch() { ... };
此示例的最后一行将触发一个已更改事件,因为属性本身更改为另一个值

但是,当您执行类似操作时:

myObject.RequestObject.SomeProperty = newPropertyValue;
更改的事件不会触发,因为您没有更改
RequestObject
属性本身,只有属性中的一些值。

已经很好地解释了您的方法不起作用的原因。要使其工作,您需要订阅
RequestObject的
PropertyChanged
事件:

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