Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Framework / System / Windows / FrameworkPropertyMetadata.cs / 1 / FrameworkPropertyMetadata.cs
//----------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using MS.Utility;
using System;
using System.ComponentModel; // InvalidEnumArgumentException
using System.Windows.Data; // UpdateSourceTrigger
namespace System.Windows
{
///
///
[Flags]
public enum FrameworkPropertyMetadataOptions: int
{
/// No flags
None = 0x000,
/// This property affects measurement
AffectsMeasure = 0x001,
/// This property affects arragement
AffectsArrange = 0x002,
/// This property affects parent's measurement
AffectsParentMeasure = 0x004,
/// This property affects parent's arrangement
AffectsParentArrange = 0x008,
/// This property affects rendering
AffectsRender = 0x010,
/// This property inherits to children
Inherits = 0x020,
///
/// This property causes inheritance and resource lookup to override values
/// of InheritanceBehavior that may be set on any FE in the path of lookup
///
OverridesInheritanceBehavior = 0x040,
/// This property does not support data binding
NotDataBindable = 0x080,
/// Data bindings on this property default to two-way
BindsTwoWayByDefault = 0x100,
/// This property should be saved/restored when journaling/navigating by URI
Journal = 0x400,
///
/// This property's subproperties do not affect rendering.
/// For instance, a property X may have a subproperty Y.
/// Changing X.Y does not require rendering to be updated.
///
SubPropertiesDoNotAffectRender = 0x800,
}
///
/// Metadata for supported Framework features
///
public class FrameworkPropertyMetadata : UIPropertyMetadata
{
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata() :
base()
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue) :
base(defaultValue)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(PropertyChangedCallback propertyChangedCallback) :
base(propertyChangedCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(propertyChangedCallback)
{
Initialize();
CoerceValueCallback = coerceValueCallback;
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
PropertyChangedCallback propertyChangedCallback) :
base(defaultValue, propertyChangedCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(defaultValue, propertyChangedCallback, coerceValueCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue, FrameworkPropertyMetadataOptions flags) :
base(defaultValue)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback) :
base(defaultValue, propertyChangedCallback)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(defaultValue, propertyChangedCallback, coerceValueCallback)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
/// Should animation of this property be prohibited?
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback,
bool isAnimationProhibited) :
base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
/// Should animation of this property be prohibited?
/// The UpdateSourceTrigger to use for bindings that have UpdateSourceTriger=Default.
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback,
bool isAnimationProhibited,
UpdateSourceTrigger defaultUpdateSourceTrigger) :
base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)
{
if (!BindingOperations.IsValidUpdateSourceTrigger(defaultUpdateSourceTrigger))
throw new InvalidEnumArgumentException("defaultUpdateSourceTrigger", (int) defaultUpdateSourceTrigger, typeof(UpdateSourceTrigger));
if (defaultUpdateSourceTrigger == UpdateSourceTrigger.Default)
throw new ArgumentException(SR.Get(SRID.NoDefaultUpdateSourceTrigger), "defaultUpdateSourceTrigger");
TranslateFlags(flags);
DefaultUpdateSourceTrigger = defaultUpdateSourceTrigger;
}
private void Initialize()
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) UpdateSourceTrigger.PropertyChanged) << 30);
}
private static bool IsFlagSet(FrameworkPropertyMetadataOptions flag, FrameworkPropertyMetadataOptions flags)
{
return (flags & flag) != 0;
}
private void TranslateFlags(FrameworkPropertyMetadataOptions flags)
{
Initialize();
// Convert flags to state sets. If a flag is set, then,
// the value is set on the respective property. Otherwise,
// the state remains unset
// This means that state is cumulative across base classes
// on a merge where appropriate
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsMeasure, flags))
{
AffectsMeasure = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsArrange, flags))
{
AffectsArrange = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsParentMeasure, flags))
{
AffectsParentMeasure = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsParentArrange, flags))
{
AffectsParentArrange = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsRender, flags))
{
AffectsRender = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.Inherits, flags))
{
IsInherited = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior, flags))
{
OverridesInheritanceBehavior = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.NotDataBindable, flags))
{
IsNotDataBindable = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, flags))
{
BindsTwoWayByDefault = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.Journal, flags))
{
Journal = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender, flags))
{
SubPropertiesDoNotAffectRender = true;
}
}
///
/// Property affects measurement
///
public bool AffectsMeasure
{
get { return ReadFlag(MetadataFlags.FW_AffectsMeasureID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsMeasureID, value);
}
}
///
/// Property affects arragement
///
public bool AffectsArrange
{
get { return ReadFlag(MetadataFlags.FW_AffectsArrangeID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsArrangeID, value);
}
}
///
/// Property affects parent's measurement
///
public bool AffectsParentMeasure
{
get { return ReadFlag(MetadataFlags.FW_AffectsParentMeasureID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsParentMeasureID, value);
}
}
///
/// Property affects parent's arrangement
///
public bool AffectsParentArrange
{
get { return ReadFlag(MetadataFlags.FW_AffectsParentArrangeID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsParentArrangeID, value);
}
}
///
/// Property affects rendering
///
public bool AffectsRender
{
get { return ReadFlag(MetadataFlags.FW_AffectsRenderID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsRenderID, value);
}
}
///
/// Property is inheritable
///
public bool Inherits
{
get { return IsInherited; }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
IsInherited = value;
SetModified(MetadataFlags.FW_InheritsModifiedID);
}
}
///
/// Property evaluation must span separated trees
///
public bool OverridesInheritanceBehavior
{
get { return ReadFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID, value);
SetModified(MetadataFlags.FW_OverridesInheritanceBehaviorModifiedID);
}
}
///
/// Property cannot be data-bound
///
public bool IsNotDataBindable
{
get { return ReadFlag(MetadataFlags.FW_IsNotDataBindableID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_IsNotDataBindableID, value);
}
}
///
/// Data bindings on this property default to two-way
///
public bool BindsTwoWayByDefault
{
get { return ReadFlag(MetadataFlags.FW_BindsTwoWayByDefaultID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_BindsTwoWayByDefaultID, value);
}
}
///
/// The default UpdateSourceTrigger for two-way data bindings on this property.
///
public UpdateSourceTrigger DefaultUpdateSourceTrigger
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
get { return (UpdateSourceTrigger) (((uint) _flags >> 30) & 0x3); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
if (!BindingOperations.IsValidUpdateSourceTrigger(value))
throw new InvalidEnumArgumentException("value", (int) value, typeof(UpdateSourceTrigger));
if (value == UpdateSourceTrigger.Default)
throw new ArgumentException(SR.Get(SRID.NoDefaultUpdateSourceTrigger), "value");
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint) _flags & 0x3FFFFFFF) | ((uint) value) << 30);
SetModified(MetadataFlags.FW_DefaultUpdateSourceTriggerModifiedID);
}
}
///
/// The value of this property should be saved/restored when journaling by URI
///
public bool Journal
{
get { return ReadFlag(MetadataFlags.FW_ShouldBeJournaledID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_ShouldBeJournaledID, value);
SetModified(MetadataFlags.FW_ShouldBeJournaledModifiedID);
}
}
///
/// This property's subproperties do not affect rendering.
/// For instance, a property X may have a subproperty Y.
/// Changing X.Y does not require rendering to be updated.
///
public bool SubPropertiesDoNotAffectRender
{
get { return ReadFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID, value);
SetModified(MetadataFlags.FW_SubPropertiesDoNotAffectRenderModifiedID);
}
}
///
/// Does the represent the metadata for a ReadOnly property
///
private bool ReadOnly
{
get { return ReadFlag(MetadataFlags.FW_ReadOnlyID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_ReadOnlyID, value);
}
}
///
/// Creates a new instance of this property metadata. This method is used
/// when metadata needs to be cloned. After CreateInstance is called the
/// framework will call Merge to merge metadata into the new instance.
/// Deriving classes must override this and return a new instance of
/// themselves.
///
internal override PropertyMetadata CreateInstance() {
return new FrameworkPropertyMetadata();
}
///
/// Merge set source state into this
///
///
/// Used when overriding metadata
///
/// Base metadata to merge
/// DependencyProperty that this metadata is being applied to
protected override void Merge(PropertyMetadata baseMetadata, DependencyProperty dp)
{
// Does parameter validation
base.Merge(baseMetadata, dp);
// Source type is guaranteed to be the same type or base type
FrameworkPropertyMetadata fbaseMetadata = baseMetadata as FrameworkPropertyMetadata;
if (fbaseMetadata != null)
{
// Merge source metadata into this
// Modify metadata merge state fields directly (not through accessors
// so that "modified" bits remain intact
// Merge state
// Defaults to false, derived classes can only enable
WriteFlag(MetadataFlags.FW_AffectsMeasureID, ReadFlag(MetadataFlags.FW_AffectsMeasureID) | fbaseMetadata.AffectsMeasure);
WriteFlag(MetadataFlags.FW_AffectsArrangeID, ReadFlag(MetadataFlags.FW_AffectsArrangeID) | fbaseMetadata.AffectsArrange);
WriteFlag(MetadataFlags.FW_AffectsParentMeasureID, ReadFlag(MetadataFlags.FW_AffectsParentMeasureID) | fbaseMetadata.AffectsParentMeasure);
WriteFlag(MetadataFlags.FW_AffectsParentArrangeID, ReadFlag(MetadataFlags.FW_AffectsParentArrangeID) | fbaseMetadata.AffectsParentArrange);
WriteFlag(MetadataFlags.FW_AffectsRenderID, ReadFlag(MetadataFlags.FW_AffectsRenderID) | fbaseMetadata.AffectsRender);
WriteFlag(MetadataFlags.FW_BindsTwoWayByDefaultID, ReadFlag(MetadataFlags.FW_BindsTwoWayByDefaultID) | fbaseMetadata.BindsTwoWayByDefault);
WriteFlag(MetadataFlags.FW_IsNotDataBindableID, ReadFlag(MetadataFlags.FW_IsNotDataBindableID) | fbaseMetadata.IsNotDataBindable);
// Override state
if (!IsModified(MetadataFlags.FW_SubPropertiesDoNotAffectRenderModifiedID))
{
WriteFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID, fbaseMetadata.SubPropertiesDoNotAffectRender);
}
if (!IsModified(MetadataFlags.FW_InheritsModifiedID))
{
IsInherited = fbaseMetadata.Inherits;
}
if (!IsModified(MetadataFlags.FW_OverridesInheritanceBehaviorModifiedID))
{
WriteFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID, fbaseMetadata.OverridesInheritanceBehavior);
}
if (!IsModified(MetadataFlags.FW_ShouldBeJournaledModifiedID))
{
WriteFlag(MetadataFlags.FW_ShouldBeJournaledID, fbaseMetadata.Journal);
}
if (!IsModified(MetadataFlags.FW_DefaultUpdateSourceTriggerModifiedID))
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) fbaseMetadata.DefaultUpdateSourceTrigger) << 30);
}
}
}
///
/// Notification that this metadata has been applied to a property
/// and the metadata is being sealed
///
///
/// Normally, any mutability of the data structure should be marked
/// as immutable at this point
///
/// DependencyProperty
/// Type associating metadata (null if default metadata)
protected override void OnApply(DependencyProperty dp, Type targetType)
{
// Remember if this is the metadata for a ReadOnly property
ReadOnly = dp.ReadOnly;
base.OnApply(dp, targetType);
}
///
/// Determines if data binding is supported
///
///
/// Data binding is not allowed if a property read-only, regardless
/// of the value of the IsNotDataBindable flag
///
public bool IsDataBindingAllowed
{
get { return !ReadFlag(MetadataFlags.FW_IsNotDataBindableID) && !ReadOnly; }
}
internal void SetModified(MetadataFlags id) { WriteFlag(id, true); }
internal bool IsModified(MetadataFlags id) { return ReadFlag(id); }
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//---------------------------------------------------------------------------
using MS.Utility;
using System;
using System.ComponentModel; // InvalidEnumArgumentException
using System.Windows.Data; // UpdateSourceTrigger
namespace System.Windows
{
///
///
[Flags]
public enum FrameworkPropertyMetadataOptions: int
{
/// No flags
None = 0x000,
/// This property affects measurement
AffectsMeasure = 0x001,
/// This property affects arragement
AffectsArrange = 0x002,
/// This property affects parent's measurement
AffectsParentMeasure = 0x004,
/// This property affects parent's arrangement
AffectsParentArrange = 0x008,
/// This property affects rendering
AffectsRender = 0x010,
/// This property inherits to children
Inherits = 0x020,
///
/// This property causes inheritance and resource lookup to override values
/// of InheritanceBehavior that may be set on any FE in the path of lookup
///
OverridesInheritanceBehavior = 0x040,
/// This property does not support data binding
NotDataBindable = 0x080,
/// Data bindings on this property default to two-way
BindsTwoWayByDefault = 0x100,
/// This property should be saved/restored when journaling/navigating by URI
Journal = 0x400,
///
/// This property's subproperties do not affect rendering.
/// For instance, a property X may have a subproperty Y.
/// Changing X.Y does not require rendering to be updated.
///
SubPropertiesDoNotAffectRender = 0x800,
}
///
/// Metadata for supported Framework features
///
public class FrameworkPropertyMetadata : UIPropertyMetadata
{
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata() :
base()
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue) :
base(defaultValue)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(PropertyChangedCallback propertyChangedCallback) :
base(propertyChangedCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(propertyChangedCallback)
{
Initialize();
CoerceValueCallback = coerceValueCallback;
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
PropertyChangedCallback propertyChangedCallback) :
base(defaultValue, propertyChangedCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(defaultValue, propertyChangedCallback, coerceValueCallback)
{
Initialize();
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue, FrameworkPropertyMetadataOptions flags) :
base(defaultValue)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback) :
base(defaultValue, propertyChangedCallback)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback) :
base(defaultValue, propertyChangedCallback, coerceValueCallback)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
/// Should animation of this property be prohibited?
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback,
bool isAnimationProhibited) :
base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)
{
TranslateFlags(flags);
}
///
/// Framework type metadata construction. Marked as no inline to reduce code size.
///
/// Default value of property
/// Metadata option flags
/// Called when the property has been changed
/// Called on update of value
/// Should animation of this property be prohibited?
/// The UpdateSourceTrigger to use for bindings that have UpdateSourceTriger=Default.
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public FrameworkPropertyMetadata(object defaultValue,
FrameworkPropertyMetadataOptions flags,
PropertyChangedCallback propertyChangedCallback,
CoerceValueCallback coerceValueCallback,
bool isAnimationProhibited,
UpdateSourceTrigger defaultUpdateSourceTrigger) :
base(defaultValue, propertyChangedCallback, coerceValueCallback, isAnimationProhibited)
{
if (!BindingOperations.IsValidUpdateSourceTrigger(defaultUpdateSourceTrigger))
throw new InvalidEnumArgumentException("defaultUpdateSourceTrigger", (int) defaultUpdateSourceTrigger, typeof(UpdateSourceTrigger));
if (defaultUpdateSourceTrigger == UpdateSourceTrigger.Default)
throw new ArgumentException(SR.Get(SRID.NoDefaultUpdateSourceTrigger), "defaultUpdateSourceTrigger");
TranslateFlags(flags);
DefaultUpdateSourceTrigger = defaultUpdateSourceTrigger;
}
private void Initialize()
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) UpdateSourceTrigger.PropertyChanged) << 30);
}
private static bool IsFlagSet(FrameworkPropertyMetadataOptions flag, FrameworkPropertyMetadataOptions flags)
{
return (flags & flag) != 0;
}
private void TranslateFlags(FrameworkPropertyMetadataOptions flags)
{
Initialize();
// Convert flags to state sets. If a flag is set, then,
// the value is set on the respective property. Otherwise,
// the state remains unset
// This means that state is cumulative across base classes
// on a merge where appropriate
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsMeasure, flags))
{
AffectsMeasure = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsArrange, flags))
{
AffectsArrange = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsParentMeasure, flags))
{
AffectsParentMeasure = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsParentArrange, flags))
{
AffectsParentArrange = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.AffectsRender, flags))
{
AffectsRender = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.Inherits, flags))
{
IsInherited = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior, flags))
{
OverridesInheritanceBehavior = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.NotDataBindable, flags))
{
IsNotDataBindable = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, flags))
{
BindsTwoWayByDefault = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.Journal, flags))
{
Journal = true;
}
if (IsFlagSet(FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender, flags))
{
SubPropertiesDoNotAffectRender = true;
}
}
///
/// Property affects measurement
///
public bool AffectsMeasure
{
get { return ReadFlag(MetadataFlags.FW_AffectsMeasureID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsMeasureID, value);
}
}
///
/// Property affects arragement
///
public bool AffectsArrange
{
get { return ReadFlag(MetadataFlags.FW_AffectsArrangeID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsArrangeID, value);
}
}
///
/// Property affects parent's measurement
///
public bool AffectsParentMeasure
{
get { return ReadFlag(MetadataFlags.FW_AffectsParentMeasureID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsParentMeasureID, value);
}
}
///
/// Property affects parent's arrangement
///
public bool AffectsParentArrange
{
get { return ReadFlag(MetadataFlags.FW_AffectsParentArrangeID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsParentArrangeID, value);
}
}
///
/// Property affects rendering
///
public bool AffectsRender
{
get { return ReadFlag(MetadataFlags.FW_AffectsRenderID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_AffectsRenderID, value);
}
}
///
/// Property is inheritable
///
public bool Inherits
{
get { return IsInherited; }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
IsInherited = value;
SetModified(MetadataFlags.FW_InheritsModifiedID);
}
}
///
/// Property evaluation must span separated trees
///
public bool OverridesInheritanceBehavior
{
get { return ReadFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID, value);
SetModified(MetadataFlags.FW_OverridesInheritanceBehaviorModifiedID);
}
}
///
/// Property cannot be data-bound
///
public bool IsNotDataBindable
{
get { return ReadFlag(MetadataFlags.FW_IsNotDataBindableID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_IsNotDataBindableID, value);
}
}
///
/// Data bindings on this property default to two-way
///
public bool BindsTwoWayByDefault
{
get { return ReadFlag(MetadataFlags.FW_BindsTwoWayByDefaultID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_BindsTwoWayByDefaultID, value);
}
}
///
/// The default UpdateSourceTrigger for two-way data bindings on this property.
///
public UpdateSourceTrigger DefaultUpdateSourceTrigger
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
get { return (UpdateSourceTrigger) (((uint) _flags >> 30) & 0x3); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
if (!BindingOperations.IsValidUpdateSourceTrigger(value))
throw new InvalidEnumArgumentException("value", (int) value, typeof(UpdateSourceTrigger));
if (value == UpdateSourceTrigger.Default)
throw new ArgumentException(SR.Get(SRID.NoDefaultUpdateSourceTrigger), "value");
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint) _flags & 0x3FFFFFFF) | ((uint) value) << 30);
SetModified(MetadataFlags.FW_DefaultUpdateSourceTriggerModifiedID);
}
}
///
/// The value of this property should be saved/restored when journaling by URI
///
public bool Journal
{
get { return ReadFlag(MetadataFlags.FW_ShouldBeJournaledID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_ShouldBeJournaledID, value);
SetModified(MetadataFlags.FW_ShouldBeJournaledModifiedID);
}
}
///
/// This property's subproperties do not affect rendering.
/// For instance, a property X may have a subproperty Y.
/// Changing X.Y does not require rendering to be updated.
///
public bool SubPropertiesDoNotAffectRender
{
get { return ReadFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID, value);
SetModified(MetadataFlags.FW_SubPropertiesDoNotAffectRenderModifiedID);
}
}
///
/// Does the represent the metadata for a ReadOnly property
///
private bool ReadOnly
{
get { return ReadFlag(MetadataFlags.FW_ReadOnlyID); }
set
{
if (IsSealed)
{
throw new InvalidOperationException(SR.Get(SRID.TypeMetadataCannotChangeAfterUse));
}
WriteFlag(MetadataFlags.FW_ReadOnlyID, value);
}
}
///
/// Creates a new instance of this property metadata. This method is used
/// when metadata needs to be cloned. After CreateInstance is called the
/// framework will call Merge to merge metadata into the new instance.
/// Deriving classes must override this and return a new instance of
/// themselves.
///
internal override PropertyMetadata CreateInstance() {
return new FrameworkPropertyMetadata();
}
///
/// Merge set source state into this
///
///
/// Used when overriding metadata
///
/// Base metadata to merge
/// DependencyProperty that this metadata is being applied to
protected override void Merge(PropertyMetadata baseMetadata, DependencyProperty dp)
{
// Does parameter validation
base.Merge(baseMetadata, dp);
// Source type is guaranteed to be the same type or base type
FrameworkPropertyMetadata fbaseMetadata = baseMetadata as FrameworkPropertyMetadata;
if (fbaseMetadata != null)
{
// Merge source metadata into this
// Modify metadata merge state fields directly (not through accessors
// so that "modified" bits remain intact
// Merge state
// Defaults to false, derived classes can only enable
WriteFlag(MetadataFlags.FW_AffectsMeasureID, ReadFlag(MetadataFlags.FW_AffectsMeasureID) | fbaseMetadata.AffectsMeasure);
WriteFlag(MetadataFlags.FW_AffectsArrangeID, ReadFlag(MetadataFlags.FW_AffectsArrangeID) | fbaseMetadata.AffectsArrange);
WriteFlag(MetadataFlags.FW_AffectsParentMeasureID, ReadFlag(MetadataFlags.FW_AffectsParentMeasureID) | fbaseMetadata.AffectsParentMeasure);
WriteFlag(MetadataFlags.FW_AffectsParentArrangeID, ReadFlag(MetadataFlags.FW_AffectsParentArrangeID) | fbaseMetadata.AffectsParentArrange);
WriteFlag(MetadataFlags.FW_AffectsRenderID, ReadFlag(MetadataFlags.FW_AffectsRenderID) | fbaseMetadata.AffectsRender);
WriteFlag(MetadataFlags.FW_BindsTwoWayByDefaultID, ReadFlag(MetadataFlags.FW_BindsTwoWayByDefaultID) | fbaseMetadata.BindsTwoWayByDefault);
WriteFlag(MetadataFlags.FW_IsNotDataBindableID, ReadFlag(MetadataFlags.FW_IsNotDataBindableID) | fbaseMetadata.IsNotDataBindable);
// Override state
if (!IsModified(MetadataFlags.FW_SubPropertiesDoNotAffectRenderModifiedID))
{
WriteFlag(MetadataFlags.FW_SubPropertiesDoNotAffectRenderID, fbaseMetadata.SubPropertiesDoNotAffectRender);
}
if (!IsModified(MetadataFlags.FW_InheritsModifiedID))
{
IsInherited = fbaseMetadata.Inherits;
}
if (!IsModified(MetadataFlags.FW_OverridesInheritanceBehaviorModifiedID))
{
WriteFlag(MetadataFlags.FW_OverridesInheritanceBehaviorID, fbaseMetadata.OverridesInheritanceBehavior);
}
if (!IsModified(MetadataFlags.FW_ShouldBeJournaledModifiedID))
{
WriteFlag(MetadataFlags.FW_ShouldBeJournaledID, fbaseMetadata.Journal);
}
if (!IsModified(MetadataFlags.FW_DefaultUpdateSourceTriggerModifiedID))
{
// FW_DefaultUpdateSourceTriggerEnumBit1 = 0x40000000,
// FW_DefaultUpdateSourceTriggerEnumBit2 = 0x80000000,
_flags = (MetadataFlags)(((uint)_flags & 0x3FFFFFFF) | ((uint) fbaseMetadata.DefaultUpdateSourceTrigger) << 30);
}
}
}
///
/// Notification that this metadata has been applied to a property
/// and the metadata is being sealed
///
///
/// Normally, any mutability of the data structure should be marked
/// as immutable at this point
///
/// DependencyProperty
/// Type associating metadata (null if default metadata)
protected override void OnApply(DependencyProperty dp, Type targetType)
{
// Remember if this is the metadata for a ReadOnly property
ReadOnly = dp.ReadOnly;
base.OnApply(dp, targetType);
}
///
/// Determines if data binding is supported
///
///
/// Data binding is not allowed if a property read-only, regardless
/// of the value of the IsNotDataBindable flag
///
public bool IsDataBindingAllowed
{
get { return !ReadFlag(MetadataFlags.FW_IsNotDataBindableID) && !ReadOnly; }
}
internal void SetModified(MetadataFlags id) { WriteFlag(id, true); }
internal bool IsModified(MetadataFlags id) { return ReadFlag(id); }
}
}
// 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
- Quad.cs
- ConnectionStringSettingsCollection.cs
- SqlTransaction.cs
- Geometry.cs
- UnknownBitmapEncoder.cs
- PointF.cs
- EntityStoreSchemaFilterEntry.cs
- DataSourceXmlSerializationAttribute.cs
- DataTableNewRowEvent.cs
- NamedObject.cs
- ListViewSortEventArgs.cs
- SoapAttributeAttribute.cs
- AsymmetricKeyExchangeFormatter.cs
- TriggerCollection.cs
- DataKeyPropertyAttribute.cs
- SqlVersion.cs
- LinearGradientBrush.cs
- ColumnTypeConverter.cs
- SspiWrapper.cs
- EditingScopeUndoUnit.cs
- StandardToolWindows.cs
- Grant.cs
- ColorConverter.cs
- ProcessModelInfo.cs
- TraceInternal.cs
- Point3DCollection.cs
- MetadataArtifactLoaderCompositeFile.cs
- NullableDoubleAverageAggregationOperator.cs
- GridViewColumn.cs
- ProtocolsConfigurationEntry.cs
- SspiNegotiationTokenProvider.cs
- WeakReferenceEnumerator.cs
- TypeUsage.cs
- MasterPageParser.cs
- Application.cs
- EndOfStreamException.cs
- ChannelServices.cs
- ProcessModelInfo.cs
- RelationshipWrapper.cs
- PixelShader.cs
- ObjectDataSourceStatusEventArgs.cs
- RtfControlWordInfo.cs
- CharEnumerator.cs
- DeploymentSection.cs
- MasterPageBuildProvider.cs
- ImageClickEventArgs.cs
- TraversalRequest.cs
- StylusPointDescription.cs
- AttributedMetaModel.cs
- AutoResetEvent.cs
- XsltArgumentList.cs
- Vector3D.cs
- JsonReaderWriterFactory.cs
- IisNotInstalledException.cs
- DiagnosticsConfiguration.cs
- GPPOINT.cs
- DeclarativeConditionsCollection.cs
- PackageRelationshipSelector.cs
- ExpandableObjectConverter.cs
- DataGridColumnFloatingHeader.cs
- CheckBoxStandardAdapter.cs
- FontUnitConverter.cs
- BamlLocalizableResourceKey.cs
- CngKey.cs
- ThemeableAttribute.cs
- IIS7UserPrincipal.cs
- ObjectQuery.cs
- BooleanConverter.cs
- DiagnosticSection.cs
- CodeValidator.cs
- RepeaterItemCollection.cs
- XmlStreamStore.cs
- ResXDataNode.cs
- NativeMethodsCLR.cs
- ImageAttributes.cs
- PublisherIdentityPermission.cs
- DefaultProxySection.cs
- CheckBox.cs
- CurrentTimeZone.cs
- SyndicationSerializer.cs
- ConfigurationSection.cs
- WmlPanelAdapter.cs
- TextEffectResolver.cs
- SignedPkcs7.cs
- PlaceHolder.cs
- ScrollViewer.cs
- Util.cs
- UIPermission.cs
- LocatorBase.cs
- PopupEventArgs.cs
- OLEDB_Util.cs
- ItemChangedEventArgs.cs
- FilterableData.cs
- PathSegment.cs
- TextSimpleMarkerProperties.cs
- LoadGrammarCompletedEventArgs.cs
- PersonalizablePropertyEntry.cs
- PageBreakRecord.cs
- DataGridRowAutomationPeer.cs
- WSSecurityPolicy11.cs