/// <summary> /// Write the given value onto a DependencyObject instance. /// </summary> /// <param name="instance">The DependencyObject on which to set the value.</param> /// <param name="value">The value to set.</param> public void SetValue(DependencyObject instance, T value) { if (instance != null) { EntryIndex entryIndex = instance.LookupEntry(_globalIndex); // Set the value if it's not the default, otherwise remove the value. if (!object.ReferenceEquals(value, _defaultValue)) { instance.SetEffectiveValue(entryIndex, null /* dp */, _globalIndex, null /* metadata */, value, BaseValueSourceInternal.Local); _hasBeenSet = true; } else { instance.UnsetEffectiveValue(entryIndex, null /* dp */, null /* metadata */); } } else { throw new ArgumentNullException("instance"); } }
/// <summary> /// Sets all values saved in ItemValueStorage for the given item onto the container /// </summary> /// <param name="container"></param> /// <param name="item"></param> private void SetItemValuesOnContainer(DependencyObject container, object item, int[] dpIndices) { List<KeyValuePair<int, object>> itemValues = GetItemValues(item); if (itemValues != null) { for (int i = 0; i < itemValues.Count; i++) { int dpIndex = itemValues[i].Key; for (int j = 0; j < dpIndices.Length; j++) { if (dpIndex == dpIndices[j]) { object value = itemValues[i].Value; EntryIndex entryIndex = container.LookupEntry(dpIndex); ModifiedItemValue modifiedItemValue = value as ModifiedItemValue; DependencyProperty dp = DependencyProperty.RegisteredPropertyList.List[dpIndex]; if (modifiedItemValue == null) { // set as local value if (dp != null) { // for real properties, call SetValue so that the property's // change-callback is called container.SetValue(dp, value); } else { // for "fake" properties (no corresponding DP - e.g. VSP's desired-size), // set the property directly into the effective value table container.SetEffectiveValue(entryIndex, null /*dp*/, dpIndex, null /*metadata*/, value, BaseValueSourceInternal.Local); } } else if (modifiedItemValue.IsCoercedWithCurrentValue) { // set as current-value container.SetCurrentValue(dp, modifiedItemValue.Value); } break; } } } } }