【问题标题】:C# - issue with custom raising eventsC# - 自定义引发事件的问题
【发布时间】:2014-10-10 09:16:35
【问题描述】:

我在课堂上定义我的事件:

public class EventRaiserUtility
{
    public event EventHandler updateList;

    public void updateListEvent()
    {
        if (updateList != null)
        {
            updateList(this, EventArgs.Empty);
        }
    }
    public static EventRaiserUtility raiser = new EventRaiserUtility();
}

这就是我举办活动的地方:

EventRaiserUtility.raiser.updateListEvent();

最后这是我尝试创建监听器的地方:

...
EventRaiserUtility.raiser.updateList += new EventHandler(raiser_updateList);
//placed in the init method of another class
...

private void raiser_updateList(object sender, EventArgs e)
{
    connType = MainWindowViewModel.getTTC();
}

简单地说:这个事件必须在更新列表时通知,然后更新另一个列表,getTTC()raiser_updateList

但是raiser_updateList 永远不会被调用。为什么?我所有的 3 个 sn-ps 代码都在 3 个不同的类(同一个项目)中,但这不是问题……对吧?

【问题讨论】:

  • 您不应编辑您的问题以包含建议的解决方案,以便人们可以看到最初的问题和解决方案。

标签: c# wpf events event-handling custom-events


【解决方案1】:

在调用updateListEvent 之前,您正在创建一个新的EventRaiserUtility(顺便说一下,它应该有一个大写U 以遵循.NET 约定;同上updateList => UpdateList) - 但是您正在创建一个单独的 EventRaiserUtility 以订阅该事件。它们是不同的对象,所以有不同的事件订阅者。如果您总是在引发事件之前创建一个新对象,则可能永远不会有任何订阅者。

您应该有一个 single EventRaiserUtility 存储在包含类的实例变量中 - 您将在构造时创建它,然后在一个地方订阅事件并在另一个地方引发它。 .. 但因为他们谈论的是同一个 EventRaiserUtility 对象,所以您不会失去订阅。

(不清楚这个实用程序类实际上有多大价值,老实说 - 你为什么不直接在你的类中声明事件?当EventHandler 具有完全相同的签名时,为什么还要声明你自己的委托? )

【讨论】:

  • 我已根据您对我的代表的提示编辑了代码。但是,如果我在不同的班级,我怎么能引用同一个事件实例呢?一个人如何从另一个人身上看到实例? (对不起这个愚蠢的问题,我是事件管理的新手)
  • @PieroAlberto:与您保留任何其他信息的方式相同。老实说,基本上我们对您想要做什么的了解还不够,但您需要一个对象才能真正拥有该事件。也许那 EventRaiserUtility,但您仍然需要在两个类中提供相同的实例。在不知道这些类之间的关系的情况下,很难提供帮助:(
  • 我已经做到了,感谢您的建议。看,我再次编辑了代码,现在它可以工作了! :)
  • @PieroAlberto:那是一个非常糟糕的解决方案 - 这意味着你将只能在你的 AppDomain 中拥有一个事件引发者,即使你有多个想要独立处理其事件的独立对象。您的解决方案目前可能对您来说已经足够了,但是您应该真正考虑一下您的整体设计,以及如何使“想要订阅事件的东西”在逻辑上远离“想要引发事件的东西”所以它可以以更简洁的方式订阅。
  • 好的...你有一些关于这个的链接吗? :) 无论如何,现在我将您的答案设置为正确的答案! =)
【解决方案2】:

据我所知 - 您正在订阅 EventRaiserUtility 的一个实例的事件,但从另一个没有订阅者的实例引发事件

【讨论】:

  • 如果我在不同的班级,如何引用同一事件实例?一个人如何从另一个人身上看到实例? (对不起这个愚蠢的问题,我是事件管理的新手)
  • @PieroAlberto 简要地说-您可以将您的 updateList 事件移动到您提出它的“第一”类,处理事件的“第二”类应该从 first 订阅该事件类实例。在这种情况下,您可能会发现您的 EventRaiserUtility 是多余的。
【解决方案3】:

您需要一个对象才能真正拥有该事件。也许这就是 EventRaiserUtility,但您仍然需要在两个类中提供相同的实例。不知道这些类之间的关系

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2017-05-14
    • 1970-01-01
    相关资源
    最近更新 更多