点网中 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