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

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

Linda Hamilton
发布: 2024-12-30 13:51:10
原创
225 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板