/// <summary> /// Event listener that is being invoked in two-way binding scenarios whenever /// the target node value is being changed. /// </summary> private void OnTargetChanged(object sender, DependencyChangeEventArgs <TTarget> e) { //if the target is broken or the source is not accessible, do not update the source if (SourceDependency.RootNode.IsChainBroken || TargetDependency.RootNode.IsChainBroken) { return; } TTarget targetValue = e.TryGetLeafValue(); TSource sourceValue; if (ReverseConverter != null) { sourceValue = ReverseConverter(targetValue); } else { sourceValue = (TSource)(object)targetValue; } //only update the source if its value is different than the //current one - re-assiging the same value produces a recursive //update if (sourceValue.Equals(SourceDependency.LeafValue)) { return; } //assign to source var parent = SourceDependency.LeafNode.ParentNode.NodeValue; SetMemberValue(SourceMember, parent, sourceValue); }
/// <summary> /// Event listener that is being invoked in one-way and two-way binding /// scenarios whenever the source node value is being changed. /// </summary> private void OnSourceChanged(object sender, DependencyChangeEventArgs <TSource> e) { //if we don't have a valid chain, skip immediately if (TargetDependency.RootNode.IsChainBroken) { return; } TTarget targetValue; if (e.ChangedNode.IsChainBroken) { targetValue = DefaultValue; } else { TSource sourceValue = e.TryGetLeafValue(); if (ForwardConverter != null) { targetValue = ForwardConverter(sourceValue); } else { targetValue = (TTarget)(object)sourceValue; } } //assign to target var parent = TargetDependency.LeafNode.ParentNode.NodeValue; SetMemberValue(TargetMember, parent, targetValue); }