【问题标题】:Base class implements INotifyPropertyChanged : can derived types use its PropertyChanged event?基类实现 INotifyPropertyChanged :派生类型可以使用它的 PropertyChanged 事件吗?
【发布时间】:2013-10-22 15:21:44
【问题描述】:

编辑

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

How to: Raise Base Class Events in Derived Classes (C# Programming Guide)

Derived classes cannot raise base class events


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

重构包括创建一个实现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;
}

【问题讨论】:

  • 绝对没有理由(我可以考虑)事件本身是虚拟的或被覆盖的。
  • 我已经用 MS 的相关链接更新了问题,证实了你的说法,谢谢大家!

标签: c# refactoring inotifypropertychanged


【解决方案1】:

我认为他们必须覆盖。

基本类型可以定义一个

protected void RaisePropertyChanged(string propertyName);

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

刚刚找到一些支持证据: MSDN page on implementing INotifyPropertyChanged

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2023-03-19
相关资源
最近更新 更多