小编典典

每当属性值更改时引发一个事件?

c#

有一个属性,它名为 ImageFullPath1

public string ImageFullPath1 {get; set; }

每当值改变时,我都会触发一个事件。我知道更改INotifyPropertyChanged,但是我想通过事件来更改。


阅读 308

收藏
2020-05-19

共1个答案

小编典典

INotifyPropertyChanged接口
与事件实现。该界面只有一个成员,PropertyChanged这是消费者可以订阅的事件。

理查德发布的版本不安全。以下是安全实现此接口的方法:

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;

然后在该行OnImageFullPathChanged(EventArgs.Empty)之后添加该行OnPropertyChanged("ImageFullPath")

由于我们有.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();
            }
        }
    }
2020-05-19