แจ้งเตือนเมื่อมีการทริกเกอร์เหตุการณ์จากคลาสอื่น [ซ้ำกัน]

ฉันมี

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

สิ่งนี้สามารถทำได้อย่างไร?


person Gobliins    schedule 13.12.2012    source แหล่งที่มา
comment
ขอบคุณสำหรับคำตอบทั้งหมด +1 ให้กับทุกคน   -  person Gobliins    schedule 13.12.2012


คำตอบ (3)


คุณจะต้องประกาศกิจกรรมสาธารณะในคลาส '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
    }

....
person Dave Bish    schedule 13.12.2012
comment
ไม่รู้เลยว่าทำไมการค้นหาตัวอย่างเหตุการณ์ C# ที่ชัดเจนและเรียบง่ายเช่นนี้จึงเป็นเรื่องยากเพียงเพื่อสื่อสารสองคลาส หลังจากค้นหามาหลายชั่วโมงในที่สุด... ฉันอยากจะร้องไห้ ขอบคุณมาก - person Konayuki; 29.05.2017
comment
@Konayuki: ไม่สามารถตกลงได้มากกว่านี้ ฉันกำลังมองหาตัวอย่างง่ายๆ ของสิ่งนี้ และนี่คือมัน (ที่) DaveBish: งานที่ดี - เรียบง่ายและมีประสิทธิภาพ - person Paul; 12.02.2018

คุณต้องการสามสิ่ง (ซึ่งทำเครื่องหมายด้วยความคิดเห็นในรหัส):

  1. ประกาศเหตุการณ์ในคลาส B
  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() { }
}
person Sergey Berezovskiy    schedule 13.12.2012