2015-06-21 14 views
2

我創建了一個名爲事務公共類(見下文),在我的WPF應用程序WPF類事件不燒

Public Class Transaction 

    Public Event Populate() 

    Public Sub New(TransactionType As String) 
     RaiseEvent Populate() 
    End Sub 

End Class 

然後在我的WPF窗口我已經實例化這個類的一個實例(見下文)

Public Class Window1 
    Dim WithEvents lgTransaction As Transaction 

    Private Sub buCreateTran_Click(sender As Object, e As RoutedEventArgs) Handles buCreateTran.Click 
    lgTransaction = New Transaction("SALE") 
    End Sub 


    Private Sub lgTransaction_Populate() Handles lgTransaction.Populate 
    MsgBox("Populate") 
    End Sub 
End Class 

由於某些原因,Populate事件不會在WPF Form中觸發?我是WPF的新手,所以這是我如何在傳統的vb.net中做到這一點。有沒有人有任何想法或指針,爲什麼它不是射擊?

回答

1

在事件處理程序已連線之前,您正在事務處理類中提高事件處理能力

換句話說,代理不能連接到之後構造(使用AddHandler或VB的內置「WithEvents」功能)。

你需要使它與構造類交易發生後,已經完成了移動這行代碼:

RaiseEvent Populate() 
-1

WithEventsHandles關鍵字在VB.NET是語法糖在靜態編譯連接最多事件-時間。

這裏的Dim WithEvents lgTransaction As Transaction聲明的C#反編譯相當於:

private virtual Transaction lgTransaction 
{ 
    [DebuggerNonUserCode] 
    get 
    { 
     return this._lgTransaction; 
    } 
    [DebuggerNonUserCode, MethodImpl(MethodImplOptions.Synchronized)] 
    set 
    { 
     Transaction.PopulateEventHandler populateEventHandler = 
      new Transaction.PopulateEventHandler(this.lgTransaction_Populate); 

     if (this._lgTransaction != null) 
     { 
      this._lgTransaction.Populate -= populateEventHandler; 
     } 

     this._lgTransaction = value; 

     if (this._lgTransaction == null) 
     { 
      return; 
     } 

     this._lgTransaction.Populate += populateEventHandler; 
    } 
} 

你會發現set線了處理得當,但由於線路lgTransaction = New Transaction("SALE")必須前完成Transaction構造它可以通過setter分配事件已被提升之前處理器已連線。

您需要確保在分配後引發事件,而不是在施工期間引發此事。