что такое альтернативный метод VB6 PropertyChanged в точечной сети - PullRequest
0 голосов
/ 28 сентября 2018

Я перенес элемент управления vb6 на vb.net, который ссылается на FARPoint Spread, а ниже - код VB6.

  Public Property Let RetainSelBlock(ByVal New_RetainSelBlock As Boolean)
     sprSpread.RetainSelBlock() = New_RetainSelBlock
     PropertyChanged "RetainSelBlock"
 End Property 

Приведенный ниже код представляет собой созданный мастером код VB.Net из приведенного выше кода Vb6.

 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 голосов
/ 28 сентября 2018

Спасибо, 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
0 голосов
/ 28 сентября 2018

Это в принципе правильно, но правильный способ реализации такого события выглядит следующим образом:

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, чтобы обработчики событий имели предполагаемую непротиворечивую подпись, а также вызывали событие только с помощью специального метода, который можно переопределить в производных классах, чтобы обеспечить настраиваемое поведение унаследованныхevent.

Обратите внимание, что вы также можете реализовать интерфейс INotifyPropertyChanged в классе, который имеет это свойство, а затем вызвать событие PropertyChanged.Это может быть ближе к VB6, хотя я не уверен.Приятно то, что у вас есть только одно событие, поэтому вы пишете меньше кода для производителя и потребителя, поэтому хорошо, если у вас много свойств.Недостатком является то, что вам необходимо написать условный код в приемнике, чтобы определить, какое свойство изменилось, вместо того, чтобы иметь отдельные обработчики событий для каждого свойства.

РЕДАКТИРОВАТЬ: Также не более правильное имя 'RetainSelBlockChange д ', а не RetainSelBlockChange.Принято использовать суффикс «Изменено» для события, которое вызывается после изменения значения свойства, и «Изменение» для события, которое вызывается до изменения свойства и позволяет отменить изменение.

...