c# - 冒泡事件的首选方式是什么?

标签 c# events event-bubbling

我有三个对象 ObjectA 有一个 ObjectB,ObjectB 有一个 ObjectC。当 ObjectC 触发一个事件时,我需要 ObjectA 知道它,所以这就是我所做的......

public delegate void EventFiredEventHandler();

public class ObjectA
{
    ObjectB objB;

    public ObjectA()
    {
        objB = new ObjectB();
        objB.EventFired += new EventFiredEventHandler(objB_EventFired);
    }

    private void objB_EventFired()
    {
        //Handle the event.
    }
}

public class ObjectB
{
    ObjectC objC;

    public ObjectB()
    {
        objC = new ObjectC();
        objC.EventFired += new EventFiredEventHandler(objC_EventFired);
        objC.FireEvent();
    }

    public event EventFiredEventHandler EventFired;
    protected void OnEventFired()
    {
        if(EventFired != null)
        {
            EventFired();
        }
    }

    private void objC_EventFired()
    {
            //objC fired an event, bubble it up.
        OnEventFired();
    }
}

public class ObjectC
{
    public ObjectC(){}

    public void FireEvent()
    {
        OnEventFired();
    }

    public event EventFiredEventHandler EventFired;
    protected void OnEventFired()
    {
        if(EventFired != null)
        {
            EventFired();
        }
    }
}

这是处理此问题的正确方法,还是有更好的方法?我根本不想让 ObjectA 知道 ObjectC,只希望它引发了一个事件。

最佳答案

另一种方法是使用添加/删除来包装它:

public class ObjectB
{
    ObjectC objC;

    public ObjectB()
    {
        objC = new ObjectC();
    }

    public event EventFiredEventHandler EventFired
    {
        add { this.objC.EventFired += value; }
        remove { this.objC.EventFired -= value; }
    }
}

关于c# - 冒泡事件的首选方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4349195/

相关文章:

c# - 如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)中冒出?

javascript - 为什么 parent 的 sibling 会冒泡?

c# - 无法在 Rider 中使用 .NET Standard 2.0 Lib 加载 Xamarin Forms 项目

events - 如何在TreeView kendo ui上获取选定节点的数据?

javascript - 如何根据 RxJs 中的事件有条件地缓冲按键输入

javascript - JS 单击事件捕获到 SVG 而不是按钮

c# - 如何使用 AutoMapper 处理 "inflate"实体

c# - 从 ExecuteMultipleResponse 方法中检索失败的实体

c# - 为什么 AcquireRequestState 隐藏 Inherited HttpApplication.AcquireRequestState 而 Application_Start 则不隐藏?

delphi - TForm.ManualDock 应该调用 onFormShow 吗?