首頁 > 後端開發 > 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板