簡體   English   中英

基類實現INotifyPropertyChanged:派生類型可以使用其PropertyChanged事件嗎?

[英]Base class implements INotifyPropertyChanged : can derived types use its PropertyChanged event?

編輯

從海報提示中,我在MSDN上找到了以下有用的鏈接:

如何:在派生類中引發基類事件(C#編程指南)

派生類不能引發基類事件


在重構時,我遇到了一個有趣的問題,到目前為止我還沒有找到答案:

重構包括創建一個實現INotifyPropertyChangedabstract基類,派生類型將使用它而不是實現接口本身。

派生類型可以使用基類事件PropertyChanged還是必須按如下所示覆蓋它?

如果他們必須override它,您能解釋為什么要這樣做嗎?

(注意:重構由Resharper建議)

public abstract class BaseDTO : INotifyPropertyChanged
{
    public virtual event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

public class ReviewDTO : BaseDTO
{
    private ImageSource _image;
    private string _summary;
    private string _url;

    public string Url
    {
        get { return _url; }
        set
        {
            if (value == _url) return;
            _url = value;
            OnPropertyChanged();
        }
    }

    public string Summary
    {
        get { return _summary; }
        set
        {
            if (value == _summary) return;
            _summary = value;
            OnPropertyChanged();
        }
    }

    public ImageSource Image
    {
        get { return _image; }
        set
        {
            if (Equals(value, _image)) return;
            _image = value;
            OnPropertyChanged();
        }
    }

    public override event PropertyChangedEventHandler PropertyChanged;
}

我不認為他們必須優先。

基本類型可以定義

受保護的void RaisePropertyChanged(string propertyName);

派生的類可以調用基本方法來觸發屬性通知。

剛剛找到了一些支持證據: 有關實現INotifyPropertyChanged的MSDN頁面

當然,您的基本類型可以添加更多的東西

  • 例如,每個唯一屬性名稱僅創建一個事件args實例(較少的垃圾對象)
  • 通過CallerMemberName推斷屬性的名稱
  • 使用lambda表達式形式來標記不正確的屬性名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM