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

本文关键字:PropertyChanged 事件 可以使 类型 实现 INotifyPropertyChanged 派生 基类 | 更新日期: 2023-09-27 18:36:35

>编辑

从海报提示中,我在 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;
}

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

我认为他们不必覆盖。

基类型可以定义

受保护的无效 RaisePropertyChanged(string propertyName);

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

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

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

  • 就像每个唯一属性名称只创建一个事件参数实例(减少垃圾对象)一样
  • 通过调用者成员名称推断属性的名称
  • 使用 lambda 表达式形式标记不正确的属性名称