基类实现 INotifyPropertyChanged :派生类型可以使用其 PropertyChanged 事件
本文关键字:PropertyChanged 事件 可以使 类型 实现 INotifyPropertyChanged 派生 基类 | 更新日期: 2023-09-27 18:36:35
>编辑
从海报提示中,我在 MSDN 上找到了以下有用的链接:
如何:引发派生类中的基类事件(C# 编程指南)
派生类无法引发基类事件
在重构时,我遇到了一个有趣的问题,到目前为止我还没有找到答案:
重构包括创建一个实现INotifyPropertyChanged
的abstract
基类,派生类型将使用它而不是实现接口本身。
派生类型是否可以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;
}
我认为他们不必覆盖。
基类型可以定义
受保护的无效 RaisePropertyChanged(string propertyName);
派生类只能调用基方法来触发属性通知。
刚刚找到一些支持证据:MSDN 页关于实现 INotifyPropertyChanged
当然,您的基本类型可以添加更多好东西
- 就像每个唯一属性名称只创建一个事件参数实例(减少垃圾对象)一样
- 通过调用者成员名称推断属性的名称
- 使用 lambda 表达式形式标记不正确的属性名称