我已经将vb6控件迁移到了引用FARPoint Spread的vb.net,下面是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。这是正确的吗?
答案 0 :(得分:2)
基本上是正确的,但是实现此类事件的正确方法如下:
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
委托的预期模式,以便事件处理程序具有预期的一致签名,并且仅通过可以在派生类中重写的专用方法引发事件,以提供自定义行为。继承的事件。
请注意,您也可以在具有该属性的类中实现INotifyPropertyChanged
接口,然后引发PropertyChanged
事件。尽管我不确定,但这实际上可能更接近VB6的处理方式。这样做的好处是,只有一个事件,因此您可以在生产者和使用者中编写更少的代码,因此,如果您有很多属性,那就很好了。缺点是您必须在使用者中编写条件代码来确定更改了哪个属性,而不是为每个属性使用不同的事件处理程序。
编辑:同样不是'RetainSelBlockChange d '的更正确名称,而不是RetainSelBlockChange
。通常,对于在属性值更改之后引发的事件,使用后缀“ Changed”,对于在属性更改之前引发的事件,使用“ Changing”作为后缀,并允许您取消更改。
答案 1 :(得分:0)
感谢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