C# - 自定义引发事件的问题

时间:2014-10-10 09:16:36

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

我的班级定义了我的活动:

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个代码段都在3个不同的类中(相同的项目),但这不是问题......对吗?

3 个答案:

答案 0 :(得分:5)

您在调用EventRaiserUtility之前创建了一个新的updateListEvent(顺便说一下,它应该有一个大写U来遵循.NET约定; ditto updateList => UpdateList) - 但您要创建单独的 EventRaiserUtility才能订阅该活动。它们是不同的对象,因此具有不同的事件订阅者。如果您在提升活动之前始终创建新对象,那么永远不会成为任何订阅者。

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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