MainPage类外部的侦听事件在按钮单击事件上多次调用方法(重复)

本文关键字:事件 调用 方法 重复 按钮 外部 MainPage 单击 | 更新日期: 2023-09-27 17:57:40

我有一种情况,我必须在MainPage类之外管理按钮单击事件(假设在B类中)。这是我正在使用的代码:

 namespace TEST
 {
     public partial class MainPage: UserControl 
     {
         public event Action simpleEvent;
         public MainPage() 
         {     
         }
         private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
         {
             switch (comboBox1.SelectedItem as string) 
             {
             case "UInt8":
                 B obj4 = new B(this, fileContent, "UInt8");
                 break;
             case "UInt16":
                 B obj1 = new B(this, fileContent, "UInt16");
                 break;
             case "UInt32":
                 B obj2 = new B(this, fileContent, "UInt32");
                 break;
             case "UInt64":
                 B obj3 = new B(this, fileContent, "UInt64");
                 goto
             default;
             default:
                 MessageBox.Show("check");
                 break;
             }
         }
         private void ButtonClick_EVENT(object sender, RoutedEventArgs e) 
         {
             // I try to listen outside the class this way.
             if (simpleEvent != null)
                 simpleEvent();
         }
     }
     Class B 
     {
         public B(MainPage Obj, byte[] fileContent, string type)
         {
             switch (type = Obj.comboBox1.SelectedItem as string)
             {
             case "UInt8":
                 {
                     //do something 
                     break;
                 }
             case "UInt16":
                 {
                     //do something
                     break;
                 }
             case "UInt32":
                 {
                     //do something 
                     break;
                 }
             case "UInt64":
                 {
                     //do something 
                     goto
                     default;
                 }
             default:
                 {
                     break;
                 }

             }
             Obj.simpleEvent += () = > MyMethod(Obj);
         }
         public void MyMethod(MainPage Obj) 
         {
             // This MessageBox repeats 2 times on second time button click
             // and 3 times on 3rd button click .
             // It should be called once even on second/third/fourth etc. button clicks.
             MessageBox.Show("Repetition check");
         }
     }
 }

问题是我的方法被反复调用。例如,当我第一次点击按钮时,它只会被调用一次(这很好)。如果我再次点击按钮,弹出的消息框会出现2次,第三次尝试时会再次弹出3次。

我想要的是在点击时只弹出一次这个消息框(即使我一次又一次地点击按钮)。

编辑:新更新的代码是我试图缩短的实际情况,所以上次我没有包含太多代码(因为我没有怀疑那个部分)。

我想做的是:在运行时,我必须在4个给定的数据类型中选择一个数据类型(uint64/32/16/8)(这将是读取文件的数据类型(构造函数调用中的"fileContent"),但它与我问的问题无关,所以留下了太多讨论)。选择该数据类型后,我单击button显示一些内容。(所以每次我第一次从combo box中选择"数据类型",然后按button显示与该数据类型对应的一些数据,然后我再次从组合框中选择另一个数据类型,然后再次按"按钮",但这一次它会弹出消息2次,当我重复同样的第三次时,它会弹出信息框3次)。

假设我在运行时(第一次尝试)首先在组合框中选择了"uint64",然后单击按钮显示消息框,它会弹出一次消息框。现在,在没有关闭应用程序的情况下,我对组合框的第二次选择是在uint32上(第二次尝试时),我再次单击"按钮",这次这个消息框弹出了两次。我不知道为什么?在第三次尝试时,它会弹出3次。

(1) 为什么信息框重复?谢谢你提前的帮助,我真的很想知道原因,还不能理解。

MainPage类外部的侦听事件在按钮单击事件上多次调用方法(重复)

每次更改组合框时,都会创建一个新的B对象。这样每次都会添加一个新的处理程序,而不会删除以前的处理程序。在添加新的处理程序时,您需要取消订阅旧的处理程序,或者只添加一个处理程序,然后简单地修改它所依赖的数据,以便该处理程序在触发时正确操作。