点网中 VB6 PropertyChanged 的替代方法是什么
what is the alternative method of VB6 PropertyChanged in dot net
我已经将一个 vb6 控件迁移到 vb.net,它引用了 FARPoint Spread,下面是 VB6 代码。
Public Property Let RetainSelBlock(ByVal New_RetainSelBlock As Boolean)
sprSpread.RetainSelBlock() = New_RetainSelBlock
PropertyChanged "RetainSelBlock"
End Property
下面的代码是向导根据上面的 Vb6 代码生成的 VB.Net 代码。
Public Property RetainSelBlock() As Boolean
Get
RetainSelBlock = sprSpread.RetainSelBlock
End Get
Set(ByVal Value As Boolean)
sprSpread.RetainSelBlock = Value
RaiseEvent RetainSelBlockChange()
End Set
End Property
Public Event RetainSelBlockChange()
如您所见,VB6 PropertyChanged 方法已更改为 RaiseEvent。这是正确的吗?
这基本上是正确的,但实现此类事件的正确方法是这样的:
Public Property RetainSelBlock() As Boolean
Get
Return sprSpread.RetainSelBlock
End Get
Set
If sprSpread.RetainSelBlock <> value Then
sprSpread.RetainSelBlock = value
OnRetainSelBlockChanged(EventArgs.Empty)
End If
End Set
End Property
Public Event RetainSelBlockChanged As EventHandler
Protected Overridable Sub OnRetainSelBlockChanged(e As EventArgs)
RaiseEvent RetainSelBlockChanged(Me, e)
End Sub
请注意,在这种情况下,仅当 属性 值实际更改时才会引发事件。如果您再次为 属性 分配相同的值,则不会再次引发该事件。此外,此代码遵循使用 EventHandler
委托的预期模式,以便事件处理程序具有预期的一致签名,以及仅通过可在派生 classes 中覆盖的专用方法引发事件为继承的事件提供自定义行为。
请注意,您还可以在具有 属性 的 class 中实现 INotifyPropertyChanged
接口,然后引发 PropertyChanged
事件。这实际上可能更接近于 VB6 的做事方式,尽管我不确定。这样做的好处是你只有一个事件,所以你在生产者和消费者中编写的代码更少,所以如果你有很多属性,那就太好了。缺点是您必须在消费者中编写条件代码以确定哪个 属性 已更改,而不是为每个 属性.
设置不同的事件处理程序
编辑:'RetainSelBlockChanged' 也不是比 RetainSelBlockChange
更正确的名称。对于 属性 值更改后引发的事件,使用 "Changed" 后缀是惯例,对于 属性 值更改之前引发的事件,使用 "Changing" 后缀并允许你取消更改。
谢谢 jmcilhinney。根据您的输入,我已经实现了 INotifyPropertyChanged 接口。下面是代码,如果以后有人想参考的话。
Public Property RetainSelBlock() As Boolean
Get
Return sprSpread.RetainSelBlock
End Get
Set
If sprSpread.RetainSelBlock <> Value Then
sprSpread.RetainSelBlock = Value
OnRetainSelBlockChanged("RetainSelBlock")
End If
End Set
End Property
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnRetainSelBlockChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
我已经将一个 vb6 控件迁移到 vb.net,它引用了 FARPoint Spread,下面是 VB6 代码。
Public Property Let RetainSelBlock(ByVal New_RetainSelBlock As Boolean)
sprSpread.RetainSelBlock() = New_RetainSelBlock
PropertyChanged "RetainSelBlock"
End Property
下面的代码是向导根据上面的 Vb6 代码生成的 VB.Net 代码。
Public Property RetainSelBlock() As Boolean
Get
RetainSelBlock = sprSpread.RetainSelBlock
End Get
Set(ByVal Value As Boolean)
sprSpread.RetainSelBlock = Value
RaiseEvent RetainSelBlockChange()
End Set
End Property
Public Event RetainSelBlockChange()
如您所见,VB6 PropertyChanged 方法已更改为 RaiseEvent。这是正确的吗?
这基本上是正确的,但实现此类事件的正确方法是这样的:
Public Property RetainSelBlock() As Boolean
Get
Return sprSpread.RetainSelBlock
End Get
Set
If sprSpread.RetainSelBlock <> value Then
sprSpread.RetainSelBlock = value
OnRetainSelBlockChanged(EventArgs.Empty)
End If
End Set
End Property
Public Event RetainSelBlockChanged As EventHandler
Protected Overridable Sub OnRetainSelBlockChanged(e As EventArgs)
RaiseEvent RetainSelBlockChanged(Me, e)
End Sub
请注意,在这种情况下,仅当 属性 值实际更改时才会引发事件。如果您再次为 属性 分配相同的值,则不会再次引发该事件。此外,此代码遵循使用 EventHandler
委托的预期模式,以便事件处理程序具有预期的一致签名,以及仅通过可在派生 classes 中覆盖的专用方法引发事件为继承的事件提供自定义行为。
请注意,您还可以在具有 属性 的 class 中实现 INotifyPropertyChanged
接口,然后引发 PropertyChanged
事件。这实际上可能更接近于 VB6 的做事方式,尽管我不确定。这样做的好处是你只有一个事件,所以你在生产者和消费者中编写的代码更少,所以如果你有很多属性,那就太好了。缺点是您必须在消费者中编写条件代码以确定哪个 属性 已更改,而不是为每个 属性.
编辑:'RetainSelBlockChanged' 也不是比 RetainSelBlockChange
更正确的名称。对于 属性 值更改后引发的事件,使用 "Changed" 后缀是惯例,对于 属性 值更改之前引发的事件,使用 "Changing" 后缀并允许你取消更改。
谢谢 jmcilhinney。根据您的输入,我已经实现了 INotifyPropertyChanged 接口。下面是代码,如果以后有人想参考的话。
Public Property RetainSelBlock() As Boolean
Get
Return sprSpread.RetainSelBlock
End Get
Set
If sprSpread.RetainSelBlock <> Value Then
sprSpread.RetainSelBlock = Value
OnRetainSelBlockChanged("RetainSelBlock")
End If
End Set
End Property
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnRetainSelBlockChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub