Imports Infragistics.Shared
Imports Infragistics.Win
Public Class ExampleClass
    Inherits SubObjectBase
    Private appearanceHolder As appearanceHolder
    Private enabledValue As Boolean
    ' Listens for property change notifications of the object's sub objects.
    Protected Overrides Sub OnSubObjectPropChanged(ByVal pci As Infragistics.Shared.PropChangeInfo)
        ' Check if the source is our appearance object.
        If Not Me.appearanceHolder Is Nothing _
        AndAlso pci.Source.Equals(Me.appearanceHolder.RootAppearance) Then
            ' Do what needs to be done (if anything) based on the 
            ' nature of the change
            Dim propId As AppearancePropIds
            propId = pci.PropId
            If propId = AppearancePropIds.Image _
            OrElse propId = AppearancePropIds.ImageHAlign _
            OrElse propId = AppearancePropIds.ImageVAlign Then
                Me.DirtyImage()
            Else
                Me.DirtyText()
            End If
            ' Call NotifyPropChange with the appropriate property id
            ' and the PropChangeInfo instance that was passed into
            ' this method.
            Me.NotifyPropChange(StatusBarPropertyIds.Appearance, pci)
            ' Note: If there are any listeners to our 'SubObjectPropChanged' 
            ' event, the event will be raised with a new PropChangeInfo
            ' event argument whose properties will be set as follows:
            ' 1. The Source property will refer to this object.
            ' 2. The PropId property will be StatusBarPropertyIds.Appearance.
            ' 3. The Trigger property will be the passed in PropChangeInfo.
            '
            ' This will effectively create a chain of PropChangeInfo
            ' objects, with the new one at the head, that exposes
            ' complete context information regarding the change. 
            Return
        End If
        ' There is an overload to the 'NotifyPropChange' method
        ' that just takes the passed in PropChangeInfo object.
        ' This is useful if you want to pass the notification
        ' along to this object's listeners 'as is'. In other words,
        ' without creating a new PropChangeInfo to add to the 
        ' head of the chain (refer to above comments).
        Me.NotifyPropChange(pci)
        Dim sb As System.Text.StringBuilder
        ' The following code walks up the PropChangeInfo chain
        ' and writes out the source and property id of each
        ' object.
        While Not pci Is Nothing
            sb = New System.Text.StringBuilder()
            sb.Append("Property Id: ")
            sb.Append(pci.PropId.ToString())
            sb.Append(", source: ")
            sb.Append(pci.Source.ToString())
            sb.Append(". type: ")
            sb.Append(pci.Source.GetType().ToString())
            Debug.WriteLine(sb.ToString())
            Debug.Indent()
        End While
        ' Get the next PropChangeInfo object in the chain 
        pci = pci.Trigger
        ' Reset the indent level of the Debug object
        Debug.IndentLevel = 0
        ' Alternatively there are 'Find...' methods that
        ' will walk up the chain until they find the 
        ' requested PropChangeInfo object to return or
        ' they will return null.
        pci = pci.FindPropId(AppearancePropIds.BackGradientStyle)
        pci = pci.FindTrigger(Me.appearanceHolder.RootAppearance)
        ' There is also a 'FindSource' method which will
        ' return the source object based on the passed
        ' in type. If no source object of that type is
        ' found in the chain this method will return null.
        Dim source As Object
        source = pci.FindSource(GetType(Infragistics.Win.Appearance))
    End Sub
    Public Property Enabled() As Boolean
        Get
            Return Me.enabledValue
        End Get
        Set(ByVal Value As Boolean)
            If Not Me.enabledValue = Value Then
                Me.enabledValue = Value
                ' Call the overload to the 'NotifyPropChange' method
                ' that just takes a property id. 
                Me.NotifyPropChange(StatusBarPropertyIds.Enabled)
                ' Note: If there are any listeners to our 'SubObjectPropChanged' 
                ' event, the event will be raised with a PropChangeInfo
                ' event argument whose properties will be` set as follows:
                ' 1. The Source property will refer to this object.
                ' 2. The PropId property will be StatusBarPropertyIds.Enabled.
                ' 3. The Trigger property will be null.
            End If
        End Set
    End Property
    Public ReadOnly Property Appearance() As AppearanceBase
        Get
            ' Lazily create the appearance holder
            If Me.appearanceHolder Is Nothing Then
                Me.appearanceHolder = New AppearanceHolder()
                ' Listen in to property changes generated by the
                ' object. When one of its properties changes our 
                ' 'OnSubObjectPropChanged' method will be called.
                AddHandler Me.appearanceHolder.SubObjectPropChanged, Me.SubObjectPropChangeHandler
            End If
            Return Me.appearanceHolder.Appearance
        End Get
    End Property
    Protected Overrides Sub OnDispose()
        If Not Me.appearanceHolder Is Nothing Then
            ' Remove ourselves as a listener
            RemoveHandler Me.appearanceHolder.SubObjectPropChanged, Me.SubObjectPropChangeHandler
        End If
    End Sub
    Private Sub DirtyImage()
    End Sub
    Private Sub DirtyText()
    End Sub
End Class
Public Enum StatusBarPropertyIds
    Appearance = 1
    Enabled = 2
End Enum