首頁 >後端開發 >C++ >如何在 C# 引發屬性值變化事件?

如何在 C# 引發屬性值變化事件?

Barbara Streisand
Barbara Streisand原創
2024-12-28 13:57:09393瀏覽

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