如何处理PropertyChange的布尔值?

时间:2011-12-20 19:43:05

标签: vb.net

我正在创建一个程序,其中我有一个公开定义的布尔值

Public boolOverallStatus As Boolean = True

我需要在布尔值改变时执行一些代码。在以前的应用程序中,实际的表单项更改处理了这个,但它可以由几个不同的子进行更改。

我该如何处理?我正在浏览msdn,但它相当令人困惑。 简而言之:如何在发生布尔值更改事件时执行代码。

4 个答案:

答案 0 :(得分:6)

改为将其作为财产。

Private _boolOverallStatus As Boolean = True

Property boolOverallStatus As Boolean
  Get
    Return _boolOverallStatus
  End Get
  Set(ByVal value as Boolean)
    If value <> _boolOverallStatus Then
      _boolOverallStatus = value
      '// handle more code changes here.'
    End If
  End Set
End Property

答案 1 :(得分:3)

我使用以下模式,类似于Microsoft为其大多数Changed事件所做的事情。

Class MyClass

    Public Property OverallStatus As Boolean
        Get
            Return _OverallStatus
        End Get
        Set (value As Boolean)
            If _OverallStatus = value Then Exit Property
            _OverallStatus = value
            OnOverallStatusChanged(EventArgs.Empty)
        End Set
    End Property

    Private _OverallStatus As Boolean = False

    Protected Overridable Sub OnOverallStatusChanged(e As EventArgs)
        RaiseEvent OverallStatusChanged(Me, e)
    End Sub

    Public Event OverallStatusChanged As EventHandler
End Class

在VB中,您可以使用WithEventsHandles关键字处理该事件:

Class MyParent
    Private WithEvents myObject As New MyClass()

    Private Sub myobject_OverallStatusChanged(sender As Object, e As EventArgs) Handles myObject.OverallStatusChanged
       ' TODO: Write handler.
    End Sub
End Class

OnOverallStatusChanged函数对于继承类以响应更改时的第一次拍摄非常有用。

Class MyOtherClass
    Inherits MyClass

    Protected Overrides Sub OnOverallStatusChanged(e As EventArgs)
        ' TODO: Do my stuff first.
        MyBase.OnOverallStatusChanged(e)
    End Sub
End Class

答案 2 :(得分:2)

使用公共属性而不是公共变量。然后,只要属性设置良好,就可以将逻辑放在属性的Set方法中。

http://msdn.microsoft.com/en-us/library/65zdfbdt%28v=VS.100%29.aspx

Private number As Integer = 0
Public Property MyNumber As Integer
   ' Retrieves number.
   Get 
     Return number
   End Get
   ' Assigns to number.
   Set 
      CallLogicHere()
      number = value
   End Set
End Property

答案 3 :(得分:1)

您还可以定义一个事件,每次状态更改时都会触发该事件。优点是,可以通过依赖于此状态的应用程序部分来处理更改。否则逻辑必须与状态一起实现。

应用程序的其他部分可以使用AddHandler订阅活动。

Public Class OverallStatusChangedEventArgs
    Inherits EventArgs

    Public Sub New(newStatus As Boolean)
        Me.NewStatus = newStatus
    End Sub

    Private m_NewStatus As Boolean
    Public Property NewStatus() As Boolean
        Get
            Return m_NewStatus
        End Get
        Private Set
            m_NewStatus = Value
        End Set
    End Property
End Class

Module modGlobals
    Public Event OverallStatusChanged As EventHandler(Of OverallStatusChangedEventArgs)

    Private m_boolOverallStatus As Boolean = True
    Public Property BoolOverallStatus() As Boolean
        Get
            Return m_boolOverallStatus
        End Get
        Set
            If Value <> m_boolOverallStatus Then
                m_boolOverallStatus = Value
                OnOverallStatusChanged(Value)
            End If
        End Set
    End Property

    Private Sub OnOverallStatusChanged(newStatus As Boolean)
        RaiseEvent OverallStatusChanged(GetType(modGlobals), New OverallStatusChangedEventArgs(newStatus))
    End Sub
End Module