如何防止多次将事件处理程序附加到按钮?

How to prevent attaching an event handler multiple times to the button?

我正处于项目测试阶段,我正在处理将事件处理程序多次附加到按钮的问题。

我有一个带有 _btnSelecteProj 字段的 class,我通过 InitProjects 方法中的参数分配按钮引用。

Public Void InitProjects (Button btnSelectProject)
{
        _btnSelecteProj = btnSelectProject;
        _btnSelecteProj.MouseClick += BtnSelectProj_MouseClick;
}

此方法在运行时被多次调用,因此事件处理程序被多次分配,我需要防止这种情况。

我意识到这是一个错误的设计。但是,不可能重构整个项目,因为我正处于测试阶段。我在代码中的几个地方遇到了这个问题。

我试图通过这种方式来防止这个问题:

_btnSelectedProj.MouseClick -= BtnSelectProj_MouseClick;
_btnSelectedProj.MouseClick += BtnSelectProj_MouseClick;

但是不行。

感谢任何建议。

在您的活动中,您可以将 add/remove 操作实现为显式方法,并在添加时检查事件处理程序是否为空。

例如,您可以检查 _btnSelecteProj 的值是否已更改

public void InitProjects(Button btnSelectProject)
{
    if (_btnSelecteProj != null)
    {
        if (_btnSelecteProj.Equals(btnSelectProject))
            return;
        _btnSelecteProj.MouseClick -= BtnSelecteProj_MouseClick;
    }
    _btnSelecteProj = btnSelectProject;
    _btnSelecteProj.MouseClick += BtnSelecteProj_MouseClick;
}

我必须添加方法 ClearEventHandlers() 并以正确的方式删除事件处理程序。

public void ClearEventHandlers()
{
    _btnSelecteProj.MouseClick -= BtnSelectProj_MouseClick;
}

此方法在对象生命周期结束时运行。

注意:我不确定这个 question/answer 是否对其他人有用...