点网中VB6 PropertyChanged的替代方法是什么

时间:2018-09-28 02:04:31

标签: vb.net vb6-migration

我已经将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。这是正确的吗?

2 个答案:

答案 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