如何覆盖对PropertyChanged的订阅?

时间:2015-11-18 14:22:21

标签: c# wpf inotifypropertychanged

我有实现INotifyPropertyChanged的类,因此我有事件:

public event PropertyChangedEventHandler PropertyChanged

在解决方案中有很多地方(超过300个),事件监听器使用标准运算符PropertyChanged订阅+=事件。我想改变使用WeakEventManager的订阅方式来降低内存泄漏的风险。当然,我不想在代码中更改超过300个位置。这是我能够提出的,但它不起作用:

public event PropertyChangedEventHandler PropertyChanged
    {
        add
        {
            WeakEventManager<BaseNotifyPropertyChanged, EventArgs>.AddHandler(this, "PropertyChanged", (EventHandler<EventArgs>)value);
      //or
            PropertyChangedEventManager.AddHandler(this, value, "IsDirty");
        }
        remove
        {
           //....
        }
    }

但是不可能将PropertyChangedEventHandler类型转换为EventHandler<EventArgs>

如何解决问题?

UPD:

要解决上述问题,我使用了匿名方法:

WeakEventManager<BaseNotifyPropertyChanged, EventArgs>.AddHandler(this,
    "PropertyChanged",
    (sender, e) => value(sender, (PropertyChangedEventArgs)e));

感谢PeterDuniho的建议。

但现在如果我尝试举起活动:

   protected virtual void RaiseOnPropertyChangedEvent(string propertyName)
{
    var handler = PropertyChanged;

    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
   }
}

我收到了下一个错误: 事件PropertyChanged只能显示在+=-= 的左侧

这个错误是众所周知的,但在另一个上下文中。是什么原因?

1 个答案:

答案 0 :(得分:1)

不幸的是,委托方差并没有解决这个问题。但是您通常可以使用匿名方法将一个委托类型调整为另一个委托类型,使用匿名方法中的强制转换来获取要编译的代码。例如:

WeakEventManager<BaseNotifyPropertyChanged, EventArgs>.AddHandler(this,
    "PropertyChanged",
    (sender, e) => value(sender, (PropertyChangedEventArgs)e));

即。提供一个接受EventArgs声明所允许的WeakEventManager对象的处理程序,然后向下转发传递给该匿名方法处理程序的对象,以便它可以传递给需要{{1}的实际处理程序}。