[FriendAccessAllowed] // Built into Base, also used by Framework. internal static void RemoveContextFromObject( DependencyObject context, DependencyObject oldValue ) { if (context != null && oldValue.InheritanceContext == context) { context.RemoveSelfAsInheritanceContext(oldValue, null); } }
// // This method // 1. Adds or removes per-instance state on the container/child (push model) // 2. Processes a single value that needs per-instance storage // internal static void ProcessInstanceValue( DependencyObject target, int childIndex, HybridDictionary instanceValues, DependencyProperty dp, int i, bool apply) { // If we get this far, it's because there's a value // in the property value list of an active style that requires // per-instance storage. The initialization (CreateInstaceData) // should have created the InstanceValues hashtable by now. Debug.Assert(instanceValues != null, "InstanceValues hashtable should have been created at initialization time."); InstanceValueKey key = new InstanceValueKey(childIndex, dp.GlobalIndex, i); if (apply) { // Store a sentinel value in per-instance StyleData. // The actual value is created only on demand. instanceValues[key] = NotYetApplied; } else { // Remove the instance value from the table object value = instanceValues[key]; instanceValues.Remove(key); Expression expr; Freezable freezable; if ((expr = value as Expression)!= null) { // if the instance value is an expression, detach it expr.OnDetach(target, dp); } else if ((freezable = value as Freezable)!= null) { // if the instance value is a Freezable, remove its // inheritance context target.RemoveSelfAsInheritanceContext(freezable, dp); } } }