gpt4 book ai didi

c# - 基类实现 INotifyPropertyChanged : can derived types use its PropertyChanged event?

转载 作者:太空狗 更新时间:2023-10-29 19:41:11 25 4
gpt4 key购买 nike

编辑

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

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

Derived classes cannot raise base class events


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

重构包括创建一个实现INotifyPropertyChanged抽象 基类,派生类型将使用它而不是自己实现接口(interface)。

派生类型可以使用基类事件 PropertyChanged 还是必须重写它,如下所示?

如果他们必须覆盖,您能解释一下为什么应该那样吗?

(注意: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;
}

最佳答案

我不认为他们必须覆盖。

基类型可以定义一个

protected void RaisePropertyChanged(string propertyName);

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

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

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

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

关于c# - 基类实现 INotifyPropertyChanged : can derived types use its PropertyChanged event?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19521963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com