【问题标题】:Notify when event from another class is triggered [duplicate]当触发另一个类的事件时通知[重复]
【发布时间】:2012-12-13 09:33:37
【问题描述】:

我有

class A
{
    B b;

    //call this Method when b.Button_click or b.someMethod is launched
    private void MyMethod()
    {            
    }

    ??
}

Class B
{
    //here i.e. a button is pressed and in Class A 
    //i want to call also MyMethod() in Class A after the button is pressed 
    private void Button_Click(object o, EventArgs s)
    {
         SomeMethod();
    }

    public void SomeMethod()
    {           
    }

    ??
}

A 类有一个 B 类的实例。

如何做到这一点?

【问题讨论】:

    标签: c# events event-handling


    【解决方案1】:

    您需要在“B”类上声明一个公共事件 - 并让“A”类订阅它:

    类似这样的:

    class B
    {
        //A public event for listeners to subscribe to
        public event EventHandler SomethingHappened;
    
        private void Button_Click(object o, EventArgs s)
        {
            //Fire the event - notifying all subscribers
            if(SomethingHappened != null)
                SomethingHappened(this, null);
        }
    ....
    
    class A
    {
        //Where B is used - subscribe to it's public event
        public A()
        {
            B objectToSubscribeTo = new B();
            objectToSubscribeTo.SomethingHappened += HandleSomethingHappening;
        }
    
        public void HandleSomethingHappening(object sender, EventArgs e)
        {
            //Do something here
        }
    
    ....
    

    【讨论】:

    • 不知道为什么很难搜索一个像这个一样清晰和简单的 C# 事件示例,只是为了沟通两个类?经过几个小时的搜索终于......我想哭,非常感谢。
    • @Konayuki:完全同意。我一直在寻找一个简单的例子,就是这样。 (at)DaveBish:干得好——简单而有效。
    【解决方案2】:

    你需要三样东西(在代码中用 cmets 标记):

    1. 在 B 类中声明 event
    2. 发生某些事情时在 B 类中引发事件(在您的情况下 - 执行了 Button_Click 事件处理程序)。请记住,您需要验证是否存在任何订阅者。否则,您将在引发事件时收到 NullReferenceException。
    3. 订阅 B 类的事件。您需要拥有 B 类的实例,即使您也想订阅(另一种选择 - 静态事件,但这些事件将由 B 类的所有实例引发)。

    代码:

    class A
    {
        B b;
    
        public A(B b)
        {
            this.b = b;
            // subscribe to event
            b.SomethingHappened += MyMethod;
        }
    
        private void MyMethod() { }
    }
    
    class B
    {
        // declare event
        public event Action SomethingHappened;
    
        private void Button_Click(object o, EventArgs s)
        {
             // raise event
             if (SomethingHappened != null)
                 SomethingHappened();
    
             SomeMethod();
        }
    
        public void SomeMethod() { }
    }
    

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-22
        • 2011-08-16
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多