2014-06-06 51 views
0

我有一個類有一個事件,假設每次觸發它的一個屬性更改。來自一個自定義的用戶控件中的類的C#事件永遠不會觸發

public event EventHandler StructureChanged; 
    protected virtual void NotifyStructureChanged(EventArgs e) 
    { 
     if (StructureChanged != null) 
     { 
      StructureChanged(this, e); 
     } 
    } 

我在我的屬性中包含NotifyStructureChanged(new EventArgs());在我的設置語句中。每當它調用方法StructureChanged始終爲空時。我的班級是一個自定義的用戶控件的私有成員和類事件被註冊在用戶控件的構造函數,像這樣

_pt.StructureChanged += _pt_StructureChanged;

,並在這裏處理

void _pt_StructureChanged(object sender, EventArgs e) 
    { 
     UpdateControl(); 
    } 

我至今是自定義類,其中包含自定義用戶控件的私有成員。我在自定義用戶控件中註冊我的類事件。每當類屬性發生變化時,我都會更新控件以反映類中的更改。

我在這裏做錯了什麼?我在我的用戶控件上有一個按鈕,並且能夠註冊該事件,爲什麼我不能註冊我的課程活動?

+0

作爲一個側面說明,你需要做的'StructureChanged處理器= StructureChanged;'和'檢查爲handler''null'。否則,在多線程情況下會有一個競爭條件導致'NullReferenceException'。 –

回答

0

如果StructureChangednull比你附加的事件處理程序事件被觸發(或你的地方分離處理)。

也不要通過EventArgs - 它只是無用的虛擬參數。

public event EventHandler StructureChanged; 

protected virtual void OnStructureChanged() 
{ 
    if (StructureChanged != null)   
     StructureChanged(this, EventArgs.Empty);   
} 

並調用二傳手這個方法:

public Foo Bar 
{ 
    get { return _bar; } 
    set { 
     if (_bar == value) 
      return; 

     _bar = value; 
     OnStructureChanged(); 
    } 
} 
+0

當方法中的StructureChanged字段始終爲空時,我會在setter中調用'OnStructureChanged()'方法。我沒有明確地分離我的代碼中的任何地方的處理程序。該用戶控件是帶有按鈕,文本框的圖形,並用於winform。 – user3421997

+0

@ user3421997那麼你肯定會在附加* handler之前引發事件*。很高興看到你的制定者和這個邏輯的參與者。誰提出事件?什麼時候?誰訂閱?什麼時候? –

+0

這是我的邏輯。我有一個帶有StructureChanged事件的PtClass。這是一個自定義用戶控件的私有字段。 usercontrol在其構造函數中訂閱了StructureChanged事件。 usercontrol將託管在一個winform上。當winform加載它時,會創建一個PtClass對象,並將其分配給usercontrol。 – user3421997

相關問題