你如何处理你班上课堂上提出的事件?

时间:2009-04-14 12:17:41

标签: vb.net event-handling

我在VB.NET中有一个“部分”类。其中一半是由代码生成工具自动生成的。这一半实现了INotifyPropertyChanged,因此部分类的那部分中的任何属性都会引发PropertyChanged事件。

在我的“自定义”部分中,我声明了另一个依赖于自动生成的一个属性的属性。因此,当自动生成的属性发生更改时,我还想在依赖于它的自定义属性上引发PropertyChanged事件。

如果我进入该类的生成部分并在那里引发事件,如果我重新生成该部分,那将被覆盖,所以我不想这样做。我宁愿在我的部分类中添加一个事件处理程序来检查生成的属性是否发生了更改,如果是,则为我的自定义属性引发另一个事件。

我正在尝试写这个以挂钩我自己的事件,但它不起作用:

Private Sub MyProperty_PropertyChangedHandler( _
        ByVal sender As Object, ByVal e As PropertyChangedEventArgs _
        ) Handles Me.PropertyChanged
    Select Case e.PropertyName
        Case "AutoGenProperty"
            RaiseEvent PropertyChanged(Me, _
                New PropertyChangedEventArgs("MyProperty"))
    End Select
End Sub

我假设它是因为通常你会使用WithEvents关键字告诉编译器你正在订阅来自该对象的事件。我不知道如何在实际提升事件的类中进行此操作,或者甚至是可能的。

1 个答案:

答案 0 :(得分:2)

在你的构造函数中,你需要一些

的内容
AddHandler PropertyChanged, addressof MyProperty_PropertyChangedHandler

并从事件处理程序中删除“处理Me.PropertyChanged”,基本上是手动添加事件处理程序

其中“PropertyChanged”是您要捕获的事件的名称。

<强>更新

你不能这样做,因为ctor是在类的自动生成部分。 因此,您可以使用以下习惯用法为您添加处理程序。 您将在类中指定一个私有类,并将其作为私有成员放在新类中,当构建私有成员时,您将为该事件添加处理程序。

Public Partial MyClass
    private class MyInitialiser
       public sub new(byval myParent as MyClass)
          Addhandler myParent.PropertyChanged, addressof myParent.MyProperty_PropertyChangedHandler
       end sub
    end class
    private _myInitialiser as new MyInitialiser(me)
. . .
End Class

以上是未经测试的,但我之前已经做了很多次。

希望有所帮助:)