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

艾比

编辑

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

我不认为他们必须优先。

基本类型可以定义一个

受保护的void RaisePropertyChanged(string propertyName);

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

我可以使用其基类的实例初始化派生的数据类吗?

来自分类Dev

我可以使用C样式转换将派生类转换为私有基类吗?

来自分类Dev

无法获取派生类以使用其基类的构造函数

来自分类Dev

如何为派生类实现INotifyPropertyChanged?

来自分类Dev

如何为派生类实现INotifyPropertyChanged?

来自分类Dev

派生类会破坏基类的实现吗

来自分类Dev

我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

来自分类Dev

C ++多态性:是否可以使用从双重派生类到基类的函数?

来自分类Dev

您可以使用using将基类中的公共成员重新声明为派生类中的私有成员吗?

来自分类Dev

使用auto从基类与派生类的返回类型冲突

来自分类Dev

使用派生类型实现抽象类

来自分类Dev

ObjectDataProvider可以与派生类一起使用吗?

来自分类Dev

无法将派生类对象添加到其基类类型的列表中

来自分类Dev

是否可以使用基类构造函数使用派生类将值初始化为基类私有成员?

来自分类Dev

派生类可以在类声明中定义基类数组的大小吗?

来自分类Dev

是否可以使派生类的字段也派生?

来自分类Dev

对派生类中的成员变量使用派生类型

来自分类Dev

派生类到底从其基类继承了什么?

来自分类Dev

派生类可以访问基类的构造函数和析构函数吗?

来自分类Dev

我可以将派生类的模板参数转发到CRTP中的基类吗?

来自分类Dev

可以将匿名派生类的地址分配给基类指针C ++吗?

来自分类Dev

我可以消除下面派生类的重复代码并移动到抽象基类吗

来自分类Dev

在每个循环中使用基类类型或派生类类型

来自分类Dev

C++ 通过映射和使用来自基类的方法实现派生类

来自分类Dev

从模板类Base <A>派生类A,以便Base <A>可以使用A :: B?

来自分类Dev

从派生类中隐藏基类的实现细节

来自分类Dev

从基类和派生类之外的方法返回任何派生类类型

来自分类Dev

为什么派生类指针指向基类可以调用派生类成员函数?

Related 相关文章

  1. 1

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

  2. 2

    我可以使用其基类的实例初始化派生的数据类吗?

  3. 3

    我可以使用C样式转换将派生类转换为私有基类吗?

  4. 4

    无法获取派生类以使用其基类的构造函数

  5. 5

    如何为派生类实现INotifyPropertyChanged?

  6. 6

    如何为派生类实现INotifyPropertyChanged?

  7. 7

    派生类会破坏基类的实现吗

  8. 8

    我们可以在不知道其真实类型的情况下将基类指针转换为派生类指针吗?

  9. 9

    C ++多态性:是否可以使用从双重派生类到基类的函数?

  10. 10

    您可以使用using将基类中的公共成员重新声明为派生类中的私有成员吗?

  11. 11

    使用auto从基类与派生类的返回类型冲突

  12. 12

    使用派生类型实现抽象类

  13. 13

    ObjectDataProvider可以与派生类一起使用吗?

  14. 14

    无法将派生类对象添加到其基类类型的列表中

  15. 15

    是否可以使用基类构造函数使用派生类将值初始化为基类私有成员?

  16. 16

    派生类可以在类声明中定义基类数组的大小吗?

  17. 17

    是否可以使派生类的字段也派生?

  18. 18

    对派生类中的成员变量使用派生类型

  19. 19

    派生类到底从其基类继承了什么?

  20. 20

    派生类可以访问基类的构造函数和析构函数吗?

  21. 21

    我可以将派生类的模板参数转发到CRTP中的基类吗?

  22. 22

    可以将匿名派生类的地址分配给基类指针C ++吗?

  23. 23

    我可以消除下面派生类的重复代码并移动到抽象基类吗

  24. 24

    在每个循环中使用基类类型或派生类类型

  25. 25

    C++ 通过映射和使用来自基类的方法实现派生类

  26. 26

    从模板类Base <A>派生类A,以便Base <A>可以使用A :: B?

  27. 27

    从派生类中隐藏基类的实现细节

  28. 28

    从基类和派生类之外的方法返回任何派生类类型

  29. 29

    为什么派生类指针指向基类可以调用派生类成员函数?

热门标签

归档