首页 > 解决方案 > 如何为从另一个类引发的事件创建事件侦听器

问题描述

我正在尝试以我的主要形式为从类(在另一个文件上)引发的事件创建一个通用的侦听器/处理程序。我正在尝试这样做,因为我需要访问我的表单标签(并且这个类的实例必须是全局的,所以我不能在我的表单类中声明它)。

最终目标是在创建实例时(引发事件)在标签的“文本”属性和字符串/属性之间创建 DataBindings。

在我的课上 StaticScaleDetails:

Public Class StaticScaleDetails
    Implements System.ComponentModel.INotifyPropertyChanged
    Public Event CreatedNewScale()

    Private _ipAddress As String

    Public Property ipAddress
        Get
            Return _ipAddress
        End Get
        Set(value)
            _ipAddress = value
            RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("ipAddress"))
        End Set
    End Property

    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) _
    Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged

    Public Sub New(ByVal ip As String)
        ipAddress = ip

        RaiseEvent CreatedNewScale()
    End Sub

    Public Sub AssociateHandlers(ByRef ipObject As Object)
        ipObject.DataBindings.Add(New Binding("Text", Me, "ipAddress"))
    End Sub
End Class

我需要从我的表单类中获取一些方法来处理“CreatedNewScale()”事件。有任何想法吗?

PS:我可能需要创建一个StaticScaleDetails 实例列表,所以我宁愿不只对特定实例使用处理程序。

标签: vb.netevents

解决方案


最后,我找到了解决方案:我需要一个列表,所以我创建了它并只为列表对象添加了一个事件处理程序:

在包含一些全局变量的模块中,我声明

Public StaticScales As New BindingList(Of StaticScaleDetails)

以便可以从任何地方访问它。

我在 Main 中添加了一个事件处理程序:

Private LastIndex As Integer 'Variable to keep track of the size the list was the last time the event has been triggered

Private Sub ListIsChanged()
    If StaticScales.Count > LastIndex And StaticScales.Count <= 5 Then
        'Console.WriteLine("The list has changed: its size changed from {0} to {1}!", LastIndex, StaticScales.Count)

        SelectLabelsToAssociate()
        LastIndex = StaticScales.Count
    End If
End Sub

在我的主要负载上:

LastIndex = 0
AddHandler StaticScales.ListChanged, AddressOf ListIsChanged

可能有更多“优雅”的解决方案(例如创建一个自定义类,它仅在添加项目时触发事件,而不是在以任何方式更改列表时触发事件),但这样它就可以工作。


推荐阅读