首页 >后端开发 >C++ >如何在 C# 中引发属性值变化事件?

如何在 C# 中引发属性值变化事件?

Barbara Streisand
Barbara Streisand原创
2024-12-28 13:57:09344浏览

How to Raise Events for Property Value Changes in C#?

引发属性值更改的事件

使用属性时,您可能会遇到需要在属性值发生变化时触发事件的情况

问题:

有一个名为 ImageFullPath1 的属性,需要在其值发生变化时触发一个事件。尽管存在 INotifyPropertyChanged,但要求是使用事件来实现解决方案。

答案:

INotifyPropertyChanged 接口确实是基于事件的。它有一个成员,PropertyChanged,这是一个允许消费者订阅的事件。

但是,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 接口。

其他特定于属性的事件:

如果您还想创建一个事件对于特定属性的更改,例如 ImageFullPath,您可以添加:

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

public event EventHandler ImageFullPathChanged;

在 OnPropertyChanged("ImageFullPath") 之后调用 OnImageFullPathChanged(EventArgs.Empty)。

.Net 4.5 中的 CallerMemberAttribute:

在 .Net 4.5 及更高版本中,CallerMemberAttribute允许您删除源代码中硬编码的属性名称:

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

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

以上是如何在 C# 中引发属性值变化事件?的详细内容。更多信息请关注PHP中文网其他相关文章!

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