来自自定义usercontrol中类的C#事件从不激发
我有一个类,它有一个事件,假设每次它的一个属性更改时都会触发该事件来自自定义usercontrol中类的C#事件从不激发,c#,winforms,events,C#,Winforms,Events,我有一个类,它有一个事件,假设每次它的一个属性更改时都会触发该事件 public event EventHandler StructureChanged; protected virtual void NotifyStructureChanged(EventArgs e) { if (StructureChanged != null) { StructureChanged(this, e); }
public event EventHandler StructureChanged;
protected virtual void NotifyStructureChanged(EventArgs e)
{
if (StructureChanged != null)
{
StructureChanged(this, e);
}
}
我包括NotifyStructureChanged(neweventargs())“我的属性”中的“我的集合”语句中的“代码>”。
每当调用该方法时,StructureChanged
始终为空。我的类是自定义usercontrol中的私有成员,类事件在usercontrol的构造函数中注册,如下所示
\u pt.StructureChanged+=\u pt\u StructureChanged代码>
在这里处理
void _pt_StructureChanged(object sender, EventArgs e)
{
UpdateControl();
}
到目前为止,我拥有的是一个自定义类,其中包含一个事件,该事件是自定义用户控件的私有成员。我在自定义usercontrol中注册我的类事件。每当类属性更改时,我都会更新控件以反映类中的更改
我做错了什么?我在usercontrol上有一个按钮,可以注册该事件,为什么我不能注册我的类事件?如果StructureChanged
为null
,则在触发事件后附加事件处理程序(或者在某处分离处理程序)
也不要传递EventArgs
——它只是无用的伪参数
public event EventHandler StructureChanged;
protected virtual void OnStructureChanged()
{
if (StructureChanged != null)
StructureChanged(this, EventArgs.Empty);
}
并在setter中调用此方法:
public Foo Bar
{
get { return _bar; }
set {
if (_bar == value)
return;
_bar = value;
OnStructureChanged();
}
}
作为旁注,您需要执行StructureChanged handler=StructureChanged
并检查处理程序是否为null
。否则,在多线程情况下,存在可能导致NullReferenceException
的争用条件。当在方法中StructureChanged字段始终为null时,我确实调用setter中的OnStructureChanged()
方法。我没有在代码中的任何地方显式分离处理程序。此用户控件是带有按钮和文本框的图形控件,在winform中使用。@user3421997那么您肯定会在附加处理程序之前引发事件。很高兴看到您的setter和这个逻辑的参与者。谁提出这一事件?什么时候谁订阅?什么时候?这是我的逻辑。我有一个带有StructureChanged事件的PtClass。这是自定义usercontrol的私有字段。usercontrol订阅其构造函数中的StructureChanged事件。usercontrol将托管在winform上。当winform加载时,它创建一个PtClass对象,该对象被分配给usercontrol。