2010-01-29 95 views
2

我創建了一個可以像我想要的那樣工作的擴展方法。我注意到,partyproperty參數被「複製」到lambda表達式中。這樣我就不需要維護編輯/派對/屬性關聯的自定義列表。重寫lambda擴展方法

但是,我需要重置ButtonEdit的ButtonClick事件。既然這個是匿名的,我也不能使用 - = opertor。

所以,我的問題是 - 我該如何重寫此方法,以便委託可以被刪除?或者,我可以使用其他方法處理具有額外參數的特定事件處理程序(如partyproperty)?

private static void SetupAddressButtonClickEvent(this ButtonEdit editor, Party party, string property) 
{ 
    editor.SetAddressDisplayText(party, property); 
    editor.ButtonClick += (sender, e) => 
     { 
      party.ShowAddressLookupDialog(property); 
      editor.SetAddressDisplayText(party, property); 
     }; 
} 

謝謝 斯特凡

回答

3
Action<object,EventArgs> myaction = (sender, e) => 
     { 
      party.ShowAddressLookupDialog(property); 
      editor.SetAddressDisplayText(party, property); 
     }; 

editor.ButtonClick += myaction; 
editor.ButtonClick -= myaction; 

編輯選項2可能是:

class MyEventHandler 
{ 
    ... _property; 
    ... _party; 
    ... _editor; 
    public MyEventHandler(... property, ... party, ... editor) 
    { 
    _property = property; 
    _party = party; 
    _editor = editor; 
    } 

    public void Handler(object sender, EventArgs e) 
    { 
    _party.ShowAddressLookupDialog(_property); 
    _editor.SetAddressDisplayText(_party, _property); 
    } 
} 

,然後用它是這樣的:

var handler = new MyEventHandler(party,property,editor); 
editor.ButtonClick += handler.Handler; 

我不確定這對你有多大幫助,因爲我不能100%理解你想要解決的問題。

+0

所以我需要在內部存儲ButtonEdit/Action關聯列表? – Stefan 2010-01-29 08:46:30

+0

我不知道您在何處嘗試刪除該操作,因此無法真正幫助您刪除該操作。你是否試圖在另一個點擊處理程序中刪除它? – 2010-01-29 09:00:23

+0

在重新綁定窗體上的控件之前,我刪除了事件處理程序。如果我不重置它,事件處理程序將引用一個已處理的對象。儘管你的選擇2看起來很有趣。這種方法有一個名字嗎? – Stefan 2010-01-29 09:12:25