【问题标题】:Unsubscribe / remove Event Handler with custom arguments使用自定义参数取消订阅/删除事件处理程序
【发布时间】:2013-10-09 15:58:16
【问题描述】:

我使用以下代码订阅/创建自定义Event Handler

myButton.Click += (sender, e) => MyButtonClick(sender, e, stuff1, stuff2);


我想取消订阅/删除并尝试这样:

myButton.Click += MyButtonClick;

但抛出以下错误:
No overload for 'MyButtonClick' matches delegate 'System.Windows.RoutedEventHandler'


像这样:

myButton.Click += MyButtonClick(sender, e, stuff1, stuff2);

但抛出以下错误:
Cannot implicitly convert type 'void' to 'System.Windows.RoutedEventHandler'


我如何取消订阅/删除相同的Event Handler

【问题讨论】:

    标签: c# wpf visual-studio events event-handling


    【解决方案1】:

    当您使用Lambda 时,您需要保留它的引用以取消订阅。

    试试这个

    RoutedEventHandler handler = (sender, e) => MyButtonClick(sender, e, stuff1, stuff2);
    myButton.Click +=  handler;//Subscribe
    //Some more code
    myButton.Click -=  handler;//Unsubscribe
    

    【讨论】:

      【解决方案2】:

      这是因为您的方法与事件处理程序的签名不匹配。在您的第一个示例中,您正在创建一个具有正确签名的匿名方法,该方法调用您的方法并将该匿名方法添加为事件处理程序。

      如果你不喜欢这种方法,那么简单地创建一个包装方法来满足签名并调用另一个方法,这基本上就是你正在做的事情,例如

      public void MyButtonClickWrapper(object sender, EventArgs e)
      {
          MyButtonClick(sender, e);
      }
      

      然后你可以用正常的方式把它连接起来:

      myButton.Click += MyButtonClickWrapper
      myButton.Click -= MyButtonClickWrapper
      

      【讨论】:

      • 谢谢 BenRobinson,您的回答有效,但 @SriramSakthivel 的回答正是我想要的。
      • 这是默认行为,他询问是否使用自定义事件处理程序
      【解决方案3】:

      一个例子:

      EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate
      
      myButton.Click += myEvent;//suscribe
      myButton.Click -= myEvent;//unsuscribe
      
      private void MyMethod(MyParameterType myParameter)
      {
       //Do something
      }
      

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 2021-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        相关资源
        最近更新 更多