📜  如何订阅 inotifypropertychanged (1)

📅  最后修改于: 2023-12-03 15:38:54.593000             🧑  作者: Mango

如何订阅 INotifyPropertyChanged

当我们需要对对象的属性进行监视,并在属性值发生变化时执行相应操作时,可以使用 INotifyPropertyChanged 接口来实现。

1. 基本概念
1.1 INotifyPropertyChanged 接口

INotifyPropertyChanged 接口定义了 PropertyChanged 事件,当对象的属性值发生变化时,会触发该事件。

public interface INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
}
1.2 PropertyChangedEventHandler 委托

PropertyChangedEventHandler 委托定义了 PropertyChanged 事件的处理方法,该方法包含两个参数,一个是事件源对象,另一个是 PropertyChangedEventArgs 对象,后者包含了属性名和新值等信息。

public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e);
1.3 PropertyChangedEventArgs 类

PropertyChangedEventArgs 类包含了属性名和新值等信息。

public class PropertyChangedEventArgs : EventArgs
{
    public string PropertyName { get; }
    public object NewValue { get; }
    // ...
}
2. 订阅 PropertyChanged 事件

我们可以通过以下方式订阅对象的 PropertyChanged 事件:

var obj = new MyClass();
obj.PropertyChanged += HandlePropertyChanged;

其中,HandlePropertyChanged 是我们自己实现的方法,该方法的参数为事件源对象和 PropertyChangedEventArgs 对象。

private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
{
    // 处理属性变化事件
}
3. 触发 PropertyChanged 事件

当对象的属性值发生变化时,我们需要手动触发 PropertyChanged 事件:

class MyClass : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                _name = value;
                OnPropertyChanged(nameof(Name));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

在属性的 setter 中调用 OnPropertyChanged 方法,将属性名传递给该方法,即可触发 PropertyChanged 事件。

4. 总结

通过实现 INotifyPropertyChanged 接口,我们可以实现对对象属性变化的监视,并在变化时执行相应操作。需要注意的是,我们需要手动触发 PropertyChanged 事件,并将属性名和新值等信息传递给事件处理方法。