2013-09-01 107 views
0

我宣佈一個訂閱事件:爲什麼訂閱的事件始終爲空?

public class MainClass 
{ 
    public void btndel_bar_Click(object sender, RoutedEventArgs e) 
    { 
     SomeClass sc = new SomeClass(); 
     sc.FieldUpdate += new SomeClass.FieldUpdateHandler(sc_FieldUpdate); 
    } 

    void sc_FieldUpdate(object sender, ValueEventArgs e) 
    { 
     MessageBox.Show(e.Smth_property); 
    } 
} 

這裏是我要聽事件:

public class Someclass 
{ 
    public delegate void FieldUpdateHandler(object sender, ValueEventArgs e); 
    public event FieldUpdateHandler FieldUpdate; 

    void Somemethod() 
    { 
     string str = "Steel"; 
     ValueEventArgs args = new ValueEventArgs(str); 
     FieldUpdate(this, args); 
    } 
} 

承載數據的類:

public class ValueEventArgs : EventArgs 
{ 
    private string smth; 

    public ValueEventArgs(string smth) 
    { 
     this.smth = smth; 
    } 

    public string Smth_property 
    { 
     get { return smth; } 
    } 
} 

我一直有FieldUpdate=null 。如何解決它?

+1

如果您在'btnDelBar..'中聲明'SomeClass',那麼它的範圍在該方法內 – Sayse

+0

它甚至不會編譯... – BartoszKP

+0

您正在訂閱來自在同一方法中實例化的對象的事件,立即超出範圍。 –

回答

0

我讀過的文章,閱讀後,我一直以爲我再次讓所有操作。我再一次做了,它的工作原理!因此,當我在一開始就做錯了事情。

3

在調用代碼有機會添加事件處理函數之前,您在構造函數中調用Somemethod()
因此,該事件仍爲空。

+0

我編輯了我的訂閱條件。舉個例子,我在構造函數中使用腳註。其實我不會在構造函數中訂閱。 - – StepUp

0

當您創建SomeClass的對象時,您的事件將被重新初始化。

讓您的活動靜態的,所以SomeClass的的多個對象將分享有關委託和事件它

public static event FieldUpdateHandler FieldUpdate; 
+0

我有一個代碼,我的代表和事件不是靜態的,它完美的工作。但在這種情況下,我的事件是空的。 – StepUp

+0

@StepUp只會讓你的活動變得靜止。 – Anirudha

+0

它犯了一個錯誤:通過引用實例訪問成員Somemetod.FieildUpdate是不可能的;指定類型的名稱。 – StepUp

相關問題