Called when a property value changes on a sub-object.
The following sample code illustrates how classes derived from SubObjectBase can provide property change notifications with complete context information even within complex object graphs.
Also note that the SubObjectPropChanged event is public so that an application developer can also hook into the event chain at any point.
For an overview of how to handle events in Visual Basic or Visual C#, see Event Handlers in Visual Basic and Visual C#. For specific information and code examples illustrating how to consume events in your application, see Consuming Events in the .NET Framework Developer's Guide.
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
'Declaration
Protected Overrides Sub OnSubObjectPropChanged( _
ByVal As Infragistics.Shared.PropChangeInfo _
)
using System;
using System.Diagnostics;
using Infragistics.Shared;
using Infragistics.Win;
namespace SharedSnippets
{
public class ExampleClass : SubObjectBase
{
private AppearanceHolder appearanceHolder = null;
private bool enabled = true;
// Listens for property change notifications of the object's sub objects.
protected override void OnSubObjectPropChanged( PropChangeInfo pci )
{
// Check if the source is our appearance object.
if (this.appearanceHolder != null &&
pci.Source == this.appearanceHolder.RootAppearance)
{
// Do what needs to be done (if anything) based on the
// nature of the change
switch ( (AppearancePropIds)pci.PropId )
{
case AppearancePropIds.Image:
case AppearancePropIds.ImageHAlign:
case AppearancePropIds.ImageVAlign:
{
this.DirtyImage();
break;
}
default:
this.DirtyText();
break;
}
// Call NotifyPropChange with the appropriate property id
// and the PropChangeInfo instance that was passed into
// this method.
this.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;
}
// 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).
this.NotifyPropChange( pci );
// The following code walks up the PropChangeInfo chain
// and writes out the source and property id of each
// object.
while ( pci != null )
{
System.Text.StringBuilder 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();
// 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( this.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.
object source = pci.FindSource( typeof(Infragistics.Win.Appearance ) );
}
public bool Enabled
{
get { return this.enabled; }
set
{
if (this.enabled != value)
{
this.enabled = value;
// Call the overload to the 'NotifyPropChange' method
// that just takes a property id.
this.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.
}
}
}
public AppearanceBase Appearance
{
get
{
// Lazily create the appearance holder
if (this.appearanceHolder == null)
{
this.appearanceHolder = new AppearanceHolder();
// Listen in to property changes generated by the
// object. When one of its properties changes our
// 'OnSubObjectPropChanged' method will be called.
this.appearanceHolder.SubObjectPropChanged += this.SubObjectPropChangeHandler;
}
return this.appearanceHolder.Appearance;
}
}
protected override void OnDispose()
{
if ( this.appearanceHolder != null )
{
// Remove ourselves as a listener
this.appearanceHolder.SubObjectPropChanged -= this.SubObjectPropChangeHandler;
}
}
private void DirtyImage(){}
private void DirtyText(){}
}
public enum StatusBarPropertyIds
{
Appearance = 1,
Enabled = 2
}
}
'Declaration
Protected Overrides Sub OnSubObjectPropChanged( _
ByVal As Infragistics.Shared.PropChangeInfo _
)
Target Platforms: Windows 10, Windows 8.1, Windows 8, Windows 7, Windows Server 2012, Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2