示例#1
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
            {
                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);
            }
        }
示例#2
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;
            }

            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);
            }
        }