Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }