首页 >后端开发 >C++ >如何安全地实现 INotifyPropertyChanged 来获取属性值更改通知?

如何安全地实现 INotifyPropertyChanged 来获取属性值更改通知?

Linda Hamilton
Linda Hamilton原创
2024-12-30 13:51:10295浏览

How to Safely Implement INotifyPropertyChanged for Property Value Change Notifications?

如何使用事件通知属性值更改

要观察属性值更改,您可以使用 INotifyPropertyChanged 接口,其中包括 PropertyChanged 事件。消费者可以订阅此事件以检测特定属性的更改。

public interface INotifyPropertyChanged
{
    event PropertyChangedEventHandler PropertyChanged;
}

通过事件安全实现 INotifyPropertyChanged

虽然 Richard 的早期响应引入了不安全的实现,这是一个确保线程安全的修订版:

public class MyClass : INotifyPropertyChanged
{
    private string imageFullPath;

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }

    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

    public string ImageFullPath
    {
        get { return imageFullPath; }
        set
        {
            if (value != imageFullPath)
            {
                imageFullPath = value;
                OnPropertyChanged("ImageFullPath");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

这个实现:

  • 集中属性更改通知方法,以便轻松应用于多个属性。
  • 通过复制 PropertyChanged 委托来避免竞争条件。
  • 符合完全符合 INotifyPropertyChanged

其他特定属性更改事件

为了获得额外的粒度,您可以为特定属性定义单独的事件,例如:

protected void OnImageFullPathChanged(EventArgs e)
{
    EventHandler handler = ImageFullPathChanged;
    if (handler != null)
        handler(this, e);
}

public event EventHandler ImageFullPathChanged;

在属性的 setter 中,调用常规 OnPropertyChanged 事件和特定 OnImageFullPathChanged

简化属性名称获取(仅限 C# 4.5)

最后,对于 C# 4.5 及以上版本,利用 CallerMemberAttribute 自动提取属性名称,无需对于手动字符串文字:

protected void OnPropertyChanged(
        [System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }

以上是如何安全地实现 INotifyPropertyChanged 来获取属性值更改通知?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn