如何将事件冒泡到多个级别?

时间:2012-11-07 10:56:06

标签: c# .net delegates event-handling event-bubbling

我正在努力正确地冒泡一个事件。

我有一个带有用户控件的母版页,以及一个母版页的子页面。

用户控件和页面共享公共数据,因此当用户控件更新时,它会更新apage,反之亦然。

用户控件将事件暴露给母版页。这是我使用的格式。

课外:

public delegate void OfferBookmarkRemoved(int OfferID);

内课:

public event OfferBookmarkRemoved OfferBookmarkRemoved;

protected void LV_Bookmarks_ItemCommand(object source, ListViewCommandEventArgs e)
{
    if (e.CommandName == "RemoveOffer")
    {
        var offerId = (int)e.CommandArgument;

        OnOfferBookmarkRemoved(offerId);
    }

}

void OnOfferBookmarkRemoved(int offerId)
{
    offerId.ThrowDefault("offerId");

    if (OfferBookmarkRemoved != null)
    {
        OfferBookmarkRemoved(offerId);
    }
}

现在这可以在母版页中使用了。我没有在母版页中做任何事情,并希望公开事件,以便aspx页面可以使用它,如下所示:

Master.OfferBookmarkRemoved += OnBookmarkRemoved;

void OnBookmarkRemoved(int offerId)
{
    offerId.ThrowDefault("offerId");

    OfferList1.UpdateBookmark(offerId);
}

所以缺少的一点是在主设备中监听事件并使其可用于页面。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

您需要在母版页中定义此事件,如下所示:

public event EventHandler<OfferEventArgs> OfferBookmarkRemoved
{
   add
   {
       userControl.OfferBookmarkRemoved += value;
   }
   remove
   {
       userControl.OfferBookmarkRemoved -= value;
   }
}

这样,任何注册到master事件的页面都将注册到usercontrol事件。

顺便说一句,您没有关注事件模式。您的活动应如下所示:

public class OfferEventArgs : EventArgs
{
   public int OfferID { get; set; }
}

public event EventHandler<OfferEventArgs> OfferBookmarkRemoved;

并在调用时:

OfferBookmarkRemoved(new OfferEventArgs() { OfferID = offerId });