Syntax
| Visual Basic (Declaration) | |
|---|
Protected Overrides Sub OnDispose() |
| C# | |
|---|
protected override void OnDispose() |
Example
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.
| Visual Basic | Copy Code |
|---|
Imports Infragistics.Shared
Imports Infragistics.Win
Public Class ExampleClass
Inherits SubObjectBase
Private appearanceHolder As appearanceHolder
Private enabledValue As Boolean
Protected Overrides Sub OnSubObjectPropChanged(ByVal pci As Infragistics.Shared.PropChangeInfo)
If Not Me.appearanceHolder Is Nothing _
AndAlso pci.Source.Equals(Me.appearanceHolder.RootAppearance) Then
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
Me.NotifyPropChange(StatusBarPropertyIds.Appearance, pci)
Return
End If
Me.NotifyPropChange(pci)
Dim sb As System.Text.StringBuilder
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
pci = pci.Trigger
Debug.IndentLevel = 0
pci = pci.FindPropId(AppearancePropIds.BackGradientStyle)
pci = pci.FindTrigger(Me.appearanceHolder.RootAppearance)
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
Me.NotifyPropChange(StatusBarPropertyIds.Enabled)
End If
End Set
End Property
Public ReadOnly Property Appearance() As AppearanceBase
Get
If Me.appearanceHolder Is Nothing Then
Me.appearanceHolder = New AppearanceHolder()
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
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
|
| C# | Copy Code |
|---|
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
}
} |
See Also