Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / wpf / src / Base / System / Windows / DependencyPropertyChangedEventArgs.cs / 1 / DependencyPropertyChangedEventArgs.cs
using System;
using MS.Internal.WindowsBase; // FriendAccessAllowed
namespace System.Windows
{
///
/// Provides data for the various property changed events.
///
public struct DependencyPropertyChangedEventArgs
{
#region Constructors
///
/// Initializes a new instance of the DependencyPropertyChangedEventArgs class.
///
///
/// The property whose value changed.
///
///
/// The value of the property before the change.
///
///
/// The value of the property after the change.
///
public DependencyPropertyChangedEventArgs(DependencyProperty property, object oldValue, object newValue)
{
_property = property;
_metadata = null;
_oldEntry = new EffectiveValueEntry(property);
_newEntry = _oldEntry;
_oldEntry.Value = oldValue;
_newEntry.Value = newValue;
_flags = 0;
_operationType = OperationType.Unknown;
IsAValueChange = true;
}
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal DependencyPropertyChangedEventArgs(DependencyProperty property, PropertyMetadata metadata, object oldValue, object newValue)
{
_property = property;
_metadata = metadata;
_oldEntry = new EffectiveValueEntry(property);
_newEntry = _oldEntry;
_oldEntry.Value = oldValue;
_newEntry.Value = newValue;
_flags = 0;
_operationType = OperationType.Unknown;
IsAValueChange = true;
}
internal DependencyPropertyChangedEventArgs(DependencyProperty property, PropertyMetadata metadata, object value)
{
_property = property;
_metadata = metadata;
_oldEntry = new EffectiveValueEntry(property);
_oldEntry.Value = value;
_newEntry = _oldEntry;
_flags = 0;
_operationType = OperationType.Unknown;
IsASubPropertyChange = true;
}
internal DependencyPropertyChangedEventArgs(
DependencyProperty property,
PropertyMetadata metadata,
bool isAValueChange,
EffectiveValueEntry oldEntry,
EffectiveValueEntry newEntry,
OperationType operationType)
{
_property = property;
_metadata = metadata;
_oldEntry = oldEntry;
_newEntry = newEntry;
_flags = 0;
_operationType = operationType;
IsAValueChange = isAValueChange;
// This is when a mutable default is promoted to a local value. On this operation mutable default
// value acquires a freezable context. However this value promotion operation is triggered
// whenever there has been a sub property change to the mutable default. Eg. Adding a TextEffect
// to a TextEffectCollection instance which is the mutable default. Since we missed the sub property
// change due to this add, we flip the IsASubPropertyChange bit on the following change caused by
// the value promotion to coalesce these operations.
IsASubPropertyChange = (operationType == OperationType.ChangeMutableDefaultValue);
}
#endregion Constructors
#region Properties
///
/// The property whose value changed.
///
public DependencyProperty Property
{
get { return _property; }
}
///
/// Whether or not this change indicates a change to the property value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsAValueChange
{
get { return ReadPrivateFlag(PrivateFlags.IsAValueChange); }
set { WritePrivateFlag(PrivateFlags.IsAValueChange, value); }
}
///
/// Whether or not this change indicates a change to the subproperty
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsASubPropertyChange
{
get { return ReadPrivateFlag(PrivateFlags.IsASubPropertyChange); }
set { WritePrivateFlag(PrivateFlags.IsASubPropertyChange, value); }
}
///
/// Metadata for the property
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal PropertyMetadata Metadata
{
get { return _metadata; }
}
///
/// Says what operation caused this property change
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal OperationType OperationType
{
get { return _operationType; }
}
///
/// The old value of the property.
///
public object OldValue
{
get
{
EffectiveValueEntry oldEntry = OldEntry.GetFlattenedEntry(RequestFlags.FullyResolved);
if (oldEntry.IsDeferredReference)
{
// The value for this property was meant to come from a dictionary
// and the creation of that value had been deferred until this
// time for better performance. Now is the time to actually instantiate
// this value by querying it from the dictionary. Once we have the
// value we can actually replace the deferred reference marker
// with the actual value.
oldEntry.Value = ((DeferredReference) oldEntry.Value).GetValue(oldEntry.BaseValueSourceInternal);
oldEntry.IsDeferredReference = false;
}
return oldEntry.Value;
}
}
///
/// The entry for the old value (contains value and all modifier info)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal EffectiveValueEntry OldEntry
{
get { return _oldEntry; }
}
///
/// The source of the old value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal BaseValueSourceInternal OldValueSource
{
get { return _oldEntry.BaseValueSourceInternal; }
}
///
/// Says if the old value was a modified value (coerced, animated, expression)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsOldValueModified
{
get { return _oldEntry.HasModifiers; }
}
///
/// Says if the old value was a deferred value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsOldValueDeferred
{
get { return _oldEntry.IsDeferredReference; }
}
///
/// The new value of the property.
///
public object NewValue
{
get
{
EffectiveValueEntry newEntry = NewEntry.GetFlattenedEntry(RequestFlags.FullyResolved);
if (newEntry.IsDeferredReference)
{
// The value for this property was meant to come from a dictionary
// and the creation of that value had been deferred until this
// time for better performance. Now is the time to actually instantiate
// this value by querying it from the dictionary. Once we have the
// value we can actually replace the deferred reference marker
// with the actual value.
newEntry.Value = ((DeferredReference) newEntry.Value).GetValue(newEntry.BaseValueSourceInternal);
newEntry.IsDeferredReference = false;
}
return newEntry.Value;
}
}
///
/// The entry for the new value (contains value and all modifier info)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal EffectiveValueEntry NewEntry
{
get { return _newEntry; }
}
///
/// The source of the new value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal BaseValueSourceInternal NewValueSource
{
get { return _newEntry.BaseValueSourceInternal; }
}
///
/// Says if the new value was a modified value (coerced, animated, expression)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsNewValueModified
{
get { return _newEntry.HasModifiers; }
}
///
/// Says if the new value was a deferred value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsNewValueDeferred
{
get { return _newEntry.IsDeferredReference; }
}
#endregion Properties
///
///
public override int GetHashCode()
{
return base.GetHashCode();
}
///
///
public override bool Equals(object obj)
{
return Equals((DependencyPropertyChangedEventArgs)obj);
}
///
///
public bool Equals(DependencyPropertyChangedEventArgs args)
{
return (_property == args._property &&
_metadata == args._metadata &&
_oldEntry.Value == args._oldEntry.Value &&
_newEntry.Value == args._newEntry.Value &&
_flags == args._flags &&
_oldEntry.BaseValueSourceInternal == args._oldEntry.BaseValueSourceInternal &&
_newEntry.BaseValueSourceInternal == args._newEntry.BaseValueSourceInternal &&
_oldEntry.HasModifiers == args._oldEntry.HasModifiers &&
_newEntry.HasModifiers == args._newEntry.HasModifiers &&
_oldEntry.IsDeferredReference == args._oldEntry.IsDeferredReference &&
_newEntry.IsDeferredReference == args._newEntry.IsDeferredReference &&
_operationType == args._operationType);
}
///
///
public static bool operator ==(DependencyPropertyChangedEventArgs left, DependencyPropertyChangedEventArgs right)
{
return left.Equals(right);
}
///
///
public static bool operator !=(DependencyPropertyChangedEventArgs left, DependencyPropertyChangedEventArgs right)
{
return !left.Equals(right);
}
#region PrivateMethods
private void WritePrivateFlag(PrivateFlags bit, bool value)
{
if (value)
{
_flags |= bit;
}
else
{
_flags &= ~bit;
}
}
private bool ReadPrivateFlag(PrivateFlags bit)
{
return (_flags & bit) != 0;
}
#endregion PrivateMethods
#region PrivateDataStructures
private enum PrivateFlags : byte
{
IsAValueChange = 0x01,
IsASubPropertyChange = 0x02,
}
#endregion PrivateDataStructures
#region Data
private DependencyProperty _property;
private PropertyMetadata _metadata;
private PrivateFlags _flags;
private EffectiveValueEntry _oldEntry;
private EffectiveValueEntry _newEntry;
private OperationType _operationType;
#endregion Data
}
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal enum OperationType : byte
{
Unknown = 0,
AddChild = 1,
RemoveChild = 2,
Inherit = 3,
ChangeMutableDefaultValue = 4,
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
using System;
using MS.Internal.WindowsBase; // FriendAccessAllowed
namespace System.Windows
{
///
/// Provides data for the various property changed events.
///
public struct DependencyPropertyChangedEventArgs
{
#region Constructors
///
/// Initializes a new instance of the DependencyPropertyChangedEventArgs class.
///
///
/// The property whose value changed.
///
///
/// The value of the property before the change.
///
///
/// The value of the property after the change.
///
public DependencyPropertyChangedEventArgs(DependencyProperty property, object oldValue, object newValue)
{
_property = property;
_metadata = null;
_oldEntry = new EffectiveValueEntry(property);
_newEntry = _oldEntry;
_oldEntry.Value = oldValue;
_newEntry.Value = newValue;
_flags = 0;
_operationType = OperationType.Unknown;
IsAValueChange = true;
}
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal DependencyPropertyChangedEventArgs(DependencyProperty property, PropertyMetadata metadata, object oldValue, object newValue)
{
_property = property;
_metadata = metadata;
_oldEntry = new EffectiveValueEntry(property);
_newEntry = _oldEntry;
_oldEntry.Value = oldValue;
_newEntry.Value = newValue;
_flags = 0;
_operationType = OperationType.Unknown;
IsAValueChange = true;
}
internal DependencyPropertyChangedEventArgs(DependencyProperty property, PropertyMetadata metadata, object value)
{
_property = property;
_metadata = metadata;
_oldEntry = new EffectiveValueEntry(property);
_oldEntry.Value = value;
_newEntry = _oldEntry;
_flags = 0;
_operationType = OperationType.Unknown;
IsASubPropertyChange = true;
}
internal DependencyPropertyChangedEventArgs(
DependencyProperty property,
PropertyMetadata metadata,
bool isAValueChange,
EffectiveValueEntry oldEntry,
EffectiveValueEntry newEntry,
OperationType operationType)
{
_property = property;
_metadata = metadata;
_oldEntry = oldEntry;
_newEntry = newEntry;
_flags = 0;
_operationType = operationType;
IsAValueChange = isAValueChange;
// This is when a mutable default is promoted to a local value. On this operation mutable default
// value acquires a freezable context. However this value promotion operation is triggered
// whenever there has been a sub property change to the mutable default. Eg. Adding a TextEffect
// to a TextEffectCollection instance which is the mutable default. Since we missed the sub property
// change due to this add, we flip the IsASubPropertyChange bit on the following change caused by
// the value promotion to coalesce these operations.
IsASubPropertyChange = (operationType == OperationType.ChangeMutableDefaultValue);
}
#endregion Constructors
#region Properties
///
/// The property whose value changed.
///
public DependencyProperty Property
{
get { return _property; }
}
///
/// Whether or not this change indicates a change to the property value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsAValueChange
{
get { return ReadPrivateFlag(PrivateFlags.IsAValueChange); }
set { WritePrivateFlag(PrivateFlags.IsAValueChange, value); }
}
///
/// Whether or not this change indicates a change to the subproperty
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsASubPropertyChange
{
get { return ReadPrivateFlag(PrivateFlags.IsASubPropertyChange); }
set { WritePrivateFlag(PrivateFlags.IsASubPropertyChange, value); }
}
///
/// Metadata for the property
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal PropertyMetadata Metadata
{
get { return _metadata; }
}
///
/// Says what operation caused this property change
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal OperationType OperationType
{
get { return _operationType; }
}
///
/// The old value of the property.
///
public object OldValue
{
get
{
EffectiveValueEntry oldEntry = OldEntry.GetFlattenedEntry(RequestFlags.FullyResolved);
if (oldEntry.IsDeferredReference)
{
// The value for this property was meant to come from a dictionary
// and the creation of that value had been deferred until this
// time for better performance. Now is the time to actually instantiate
// this value by querying it from the dictionary. Once we have the
// value we can actually replace the deferred reference marker
// with the actual value.
oldEntry.Value = ((DeferredReference) oldEntry.Value).GetValue(oldEntry.BaseValueSourceInternal);
oldEntry.IsDeferredReference = false;
}
return oldEntry.Value;
}
}
///
/// The entry for the old value (contains value and all modifier info)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal EffectiveValueEntry OldEntry
{
get { return _oldEntry; }
}
///
/// The source of the old value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal BaseValueSourceInternal OldValueSource
{
get { return _oldEntry.BaseValueSourceInternal; }
}
///
/// Says if the old value was a modified value (coerced, animated, expression)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsOldValueModified
{
get { return _oldEntry.HasModifiers; }
}
///
/// Says if the old value was a deferred value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsOldValueDeferred
{
get { return _oldEntry.IsDeferredReference; }
}
///
/// The new value of the property.
///
public object NewValue
{
get
{
EffectiveValueEntry newEntry = NewEntry.GetFlattenedEntry(RequestFlags.FullyResolved);
if (newEntry.IsDeferredReference)
{
// The value for this property was meant to come from a dictionary
// and the creation of that value had been deferred until this
// time for better performance. Now is the time to actually instantiate
// this value by querying it from the dictionary. Once we have the
// value we can actually replace the deferred reference marker
// with the actual value.
newEntry.Value = ((DeferredReference) newEntry.Value).GetValue(newEntry.BaseValueSourceInternal);
newEntry.IsDeferredReference = false;
}
return newEntry.Value;
}
}
///
/// The entry for the new value (contains value and all modifier info)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal EffectiveValueEntry NewEntry
{
get { return _newEntry; }
}
///
/// The source of the new value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal BaseValueSourceInternal NewValueSource
{
get { return _newEntry.BaseValueSourceInternal; }
}
///
/// Says if the new value was a modified value (coerced, animated, expression)
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsNewValueModified
{
get { return _newEntry.HasModifiers; }
}
///
/// Says if the new value was a deferred value
///
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal bool IsNewValueDeferred
{
get { return _newEntry.IsDeferredReference; }
}
#endregion Properties
///
///
public override int GetHashCode()
{
return base.GetHashCode();
}
///
///
public override bool Equals(object obj)
{
return Equals((DependencyPropertyChangedEventArgs)obj);
}
///
///
public bool Equals(DependencyPropertyChangedEventArgs args)
{
return (_property == args._property &&
_metadata == args._metadata &&
_oldEntry.Value == args._oldEntry.Value &&
_newEntry.Value == args._newEntry.Value &&
_flags == args._flags &&
_oldEntry.BaseValueSourceInternal == args._oldEntry.BaseValueSourceInternal &&
_newEntry.BaseValueSourceInternal == args._newEntry.BaseValueSourceInternal &&
_oldEntry.HasModifiers == args._oldEntry.HasModifiers &&
_newEntry.HasModifiers == args._newEntry.HasModifiers &&
_oldEntry.IsDeferredReference == args._oldEntry.IsDeferredReference &&
_newEntry.IsDeferredReference == args._newEntry.IsDeferredReference &&
_operationType == args._operationType);
}
///
///
public static bool operator ==(DependencyPropertyChangedEventArgs left, DependencyPropertyChangedEventArgs right)
{
return left.Equals(right);
}
///
///
public static bool operator !=(DependencyPropertyChangedEventArgs left, DependencyPropertyChangedEventArgs right)
{
return !left.Equals(right);
}
#region PrivateMethods
private void WritePrivateFlag(PrivateFlags bit, bool value)
{
if (value)
{
_flags |= bit;
}
else
{
_flags &= ~bit;
}
}
private bool ReadPrivateFlag(PrivateFlags bit)
{
return (_flags & bit) != 0;
}
#endregion PrivateMethods
#region PrivateDataStructures
private enum PrivateFlags : byte
{
IsAValueChange = 0x01,
IsASubPropertyChange = 0x02,
}
#endregion PrivateDataStructures
#region Data
private DependencyProperty _property;
private PropertyMetadata _metadata;
private PrivateFlags _flags;
private EffectiveValueEntry _oldEntry;
private EffectiveValueEntry _newEntry;
private OperationType _operationType;
#endregion Data
}
[FriendAccessAllowed] // Built into Base, also used by Core & Framework.
internal enum OperationType : byte
{
Unknown = 0,
AddChild = 1,
RemoveChild = 2,
Inherit = 3,
ChangeMutableDefaultValue = 4,
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UrlPath.cs
- ResourcePermissionBaseEntry.cs
- Classification.cs
- RectConverter.cs
- EntityFrameworkVersions.cs
- SingleAnimationBase.cs
- ImageList.cs
- SqlCommandBuilder.cs
- GlyphRun.cs
- CompressStream.cs
- ReservationCollection.cs
- TemplateXamlParser.cs
- ToolStripGripRenderEventArgs.cs
- HtmlHistory.cs
- WebPartDisplayMode.cs
- RequestContextBase.cs
- DependencyPropertyKey.cs
- RSAProtectedConfigurationProvider.cs
- SafeRightsManagementSessionHandle.cs
- HtmlInputSubmit.cs
- ActiveXSite.cs
- InspectionWorker.cs
- MexBindingBindingCollectionElement.cs
- LineProperties.cs
- SortDescriptionCollection.cs
- MetadataItemCollectionFactory.cs
- TdsEnums.cs
- _Events.cs
- MailHeaderInfo.cs
- PrintControllerWithStatusDialog.cs
- KeyGestureConverter.cs
- AccessDataSourceView.cs
- RawTextInputReport.cs
- UnrecognizedPolicyAssertionElement.cs
- ConnectionConsumerAttribute.cs
- RoleGroupCollectionEditor.cs
- DataGridViewAddColumnDialog.cs
- RoleGroup.cs
- TrackingServices.cs
- EntityRecordInfo.cs
- TraceXPathNavigator.cs
- ArraySortHelper.cs
- x509store.cs
- DesignerVerbCollection.cs
- SelectorAutomationPeer.cs
- IPGlobalProperties.cs
- TextTreeTextBlock.cs
- BevelBitmapEffect.cs
- DataGridRowHeader.cs
- TextDecoration.cs
- TileModeValidation.cs
- ExpressionValueEditor.cs
- BitConverter.cs
- DataColumnMappingCollection.cs
- NavigationWindowAutomationPeer.cs
- ping.cs
- UnmanagedMemoryStream.cs
- HyperLinkStyle.cs
- TreeNodeStyle.cs
- WorkerRequest.cs
- ChangeInterceptorAttribute.cs
- UniqueEventHelper.cs
- KeyedHashAlgorithm.cs
- UrlPropertyAttribute.cs
- AssemblyHash.cs
- _NegotiateClient.cs
- ValidationErrorCollection.cs
- SmiEventSink_Default.cs
- CompositeActivityTypeDescriptor.cs
- TabItemWrapperAutomationPeer.cs
- DataGridViewBand.cs
- ResolveResponseInfo.cs
- TreeNode.cs
- WebPartCollection.cs
- SafeTimerHandle.cs
- Brush.cs
- MatrixTransform.cs
- IpcClientChannel.cs
- ParameterToken.cs
- SqlDelegatedTransaction.cs
- ImplicitInputBrush.cs
- uribuilder.cs
- SafeEventLogReadHandle.cs
- RichTextBoxConstants.cs
- XmlBinaryReaderSession.cs
- AnonymousIdentificationModule.cs
- RoleServiceManager.cs
- CodeValidator.cs
- mongolianshape.cs
- Transaction.cs
- PopupControlService.cs
- CreateParams.cs
- DatagridviewDisplayedBandsData.cs
- BinaryCommonClasses.cs
- MembershipValidatePasswordEventArgs.cs
- WindowsListBox.cs
- RelatedImageListAttribute.cs
- PostBackTrigger.cs
- DetectRunnableInstancesTask.cs
- ModifierKeysConverter.cs