【问题标题】:WPF Class Events Not firingWPF 类事件未触发
【发布时间】:2015-09-15 01:02:35
【问题描述】:

我在我的 WPF 应用程序中创建了一个名为 Transaction 的公共类(见下文)

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

由于某种原因,填充事件不会在 WPF 表单中触发??我是 WPF 的新手,所以这就是我在传统的 vb.net 中执行此操作的方式。有没有人对它为什么不触发有任何想法或指示?

【问题讨论】:

    标签: wpf vb.net


    【解决方案1】:

    您正在事务类中引发事件之前事件处理程序已连接。

    换句话说,在构造之后(使用 AddHandler 或 VB 内置的“WithEvents”功能)之前,不能附加委托。

    您需要移动这行代码,使其在类 Transaction 的构造函数完成后发生:

    RaiseEvent Populate()
    

    【讨论】:

      【解决方案2】:

      VB.NET 中的 WithEvents 和 Handles 关键字是在编译时静态连接事件的语法糖。

      这是 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 构造函数之前它可以通过事件具有的设置器分配在处理程序连接之前提出。

      您需要确保在分配之后引发事件,而不是在构建期间引发此事件。

      【讨论】:

        猜你喜欢
        • 2012-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多