我需要在更改属性时触发事件。当我运行此代码时,我得到的Object引用未设置为对象的实例。我究竟做错了什么?实例化事件的正确方法是什么,并在设置属性时触发它?
公共成员:
public event System.EventHandler ClassChanged;
属性集:
ClassChanged(this, EventArgs.Empty);
答案 0 :(得分:6)
您需要首先验证事件处理程序是否为null:
if (ClassChanged != null)
ClassChanged(this, EventArgs.Empty);
但总的来说,您可能希望将其包装成一个辅助方法,如下所示:
private void NotifyClassChanged() {
if (ClassChanged != null)
ClassChanged(this, EventArgs.Empty);
}
或者可能实现INotifyPropertyChanged。
答案 1 :(得分:3)
试试这个:
System.EventHandler handler = this.ClassChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
答案 2 :(得分:2)
这样做是因为没有事件处理程序订阅该事件。
确保事件的多播委托不是线程安全的null
的正确方法:
var cc = ClassChanged; //makes a copy
if (cc != null)
cc(this, EventArgs.Empty);
但是,我更喜欢的方法是使用空的lambda处理程序声明事件,因此它永远不会null
:
public event EventHandler ClassChanged = (o,e) => {};
答案 3 :(得分:1)
就像joel说的那样,没有附加到这个方法的监听器,这就是你获得异常的原因。另一种处理方法是创建一个方法,检查它是否为null,然后调用此方法而不是Event
所以,如果你有
public event System.EventHandler ClassChanged;
ClassChanged(this, EventArgs.Empty);
您可以创建以下方法
private void OnClassChanged()
{
if (ClassChanged != null)
{
ClassChanged(this, EventArgs.Empty);
}
}
并调用OnClassChanged(...)而不是ClassChanged(...)事件
答案 4 :(得分:0)
可能是ClassChanged没有附加事件处理程序。 (看不到剩下的代码) 因此,在启动ClassChanged之前,首先检查它是否为空。
if (ClassChanged != null)
{
ClassChanged(this, nully);
}