/// <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 { var sourceValue = e.TryGetLeafValue(); if (ForwardConverter != null) { targetValue = ForwardConverter(sourceValue !); } else { targetValue = (TTarget)(sourceValue as object); } } //assign to target var parent = TargetDependency.LeafNode.ParentNode?.NodeValue; if (TargetMember != null) { SetMemberValue(TargetMember, parent, targetValue); } }
/// <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; } var targetValue = e.TryGetLeafValue(); TSource sourceValue; if (ReverseConverter != null) { sourceValue = ReverseConverter(targetValue !); } else { sourceValue = (TSource)(targetValue as object); } //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) == true) { return; } //assign to source var parent = SourceDependency.LeafNode.ParentNode?.NodeValue; if (SourceMember != null) { SetMemberValue(SourceMember, parent, sourceValue); } }