2015-11-16 139 views
0

我有一個代碼,應在服務類中的一個在接收到一個事件通知委託:xamarin事件處理程序總是空

public class TestClass : ParentClass 
    { 
     public event EventHandler<string> MyDelegate; 

     public override void OnAction(Context context, Intent intent) 
     { 
      var handler = MyDelegate; 
      if (handler != null) 
      { 
       handler(this, "test"); 
      } 
     } 
    } 

我通過實例吧:

private TestClass mytest= new TestClass(); 

然後給它分配在功能之一:

mytest.MyDelegate+= (sender, info) => { 
    }; 

委託不會被調用。我已經通過調試程序,我看到代理正在分配,但類內的檢查總是空的...不知道怎麼回事...

+0

怎麼樣給它分配在構造 - 機會是你的執行順序是不正確的 –

+0

@StenPetrov哦..你的意思是如果我做了一個任務後創建一個對象,它不會工作? – Ulterior

+0

在你的'mytest.MyDelegate + = ...'和'OnAction'裏面放置一個斷點 - 看看先被命中了什麼 –

回答

1

聽起來像一個執行順序問題。可能發生的情況是TestClass內的OnAction正在代表連接之前被調用。請嘗試以下操作:

public class TestClass : ParentClass 
{ 
    public event EventHandler<string> MyDelegate; 

    public class TestClass(Action<string> myAction) 
    { 
     MyDelegate += myAction; 
    } 

    public override void OnAction(Context context, Intent intent) 
    { 
     var handler = MyDelegate; 
     if (handler != null) 
     { 
      handler(this, "test"); 
     } 
    } 
} 

只需通過構造函數傳遞的委託,本應確保其OnAction()

任何電話,您可以在幾個方面通過處理程序之前迷上了:

1。)作爲匿名方法:

private TestClass mytest= new TestClass ((sender, info) => { Console.WriteLine("Event Attached!") }); 

2.)通的方法組中:

public class MyEventHandler(object sender, string e) 
{ 
    Console.WriteLine("Event Attached!"); 
} 

private TestClass mytest= new TestClass(MyEventHandler); 

我一般建議的第二種方式,因爲它可以讓你解開的處理程序,並就清理一次你用它做:

myTest.MyDelegate -= MyEventHandler; 
+0

如何實例化一個EventHandler將其傳遞給構造函數? – Ulterior

+0

更新了答案 – pnavk