基类实现INotifyPropertyChanged:派生类型可以使用其PropertyChanged事件吗?

Ayb*_*ybe 8 c# refactoring inotifypropertychanged

编辑

从海报提示,我在MSDN上找到了以下有用的链接:

如何:在派生类中引发基类事件(C#编程指南)

派生类不能引发基类事件


在重构的过程中,我遇到了一个有趣的问题,到目前为止我还没有找到答案:

重构包括创建实现的abstract基类INotifyPropertyChanged,派生类型将使用它而不是自己实现接口.

派生类型可以使用基类事件,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;
}
Run Code Online (Sandbox Code Playgroud)

Gis*_*shu 5

我不认为他们必须覆盖.

基类型可以定义一个

protected void RaisePropertyChanged(string propertyName);

派生类只能调用基本方法来触发属性通知.

刚刚找到一些支持证据: 关于实现INotifyPropertyChanged的MSDN页面

当然,您的基本类型可以添加更多好东西

  • 比如每个唯一的属性名称只创建一个事件args实例(更少的垃圾对象)
  • 通过CallerMemberName推断属性的名称
  • 使用lambda表达式来标记不正确的属性名称