Beispiel #1
0
    /// <summary>
    /// Manually triggers update of the target value from source
    /// </summary>
    public override void RefreshTargetValue()
    {
        if (TargetDependency.RootNode.IsChainBroken) return;

        TTarget targetValue;
        if (SourceDependency.LeafNode.IsChainBroken)
        {
            targetValue = DefaultValue;
        }
        else
        {
            SourceDependency.RefreshChildNodeValue();
            TSource sourceValue = SourceDependency.LeafValue;
            if (ForwardConverter != null)
            {
                targetValue = ForwardConverter(sourceValue);
            }
            else
            {
                targetValue = (TTarget)(object)sourceValue;
            }
        }

        //assign to target
        var parent = TargetDependency.LeafNode.ParentNode.NodeValue;
        SetMemberValue(TargetMember, parent, targetValue);
    }
Beispiel #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;

      TTarget targetValue = e.TryGetLeafValue();

      TSource sourceValue;
      if (ReverseConverter != null)
      {
        sourceValue = ReverseConverter(targetValue);
      }
      else
      {
        sourceValue = (TSource) (object) targetValue;
      }

      SourceDependency.RefreshChildNodeValue(); // FIX: SourceDependency.LeafValue may be out of sync.
      //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);
    }
Beispiel #3
0
    /// <summary>
    /// Disposes the underlying bindings.
    /// </summary>
    public override void Dispose()
    {
      //deregister event listeners
      SourceDependency.DependencyChanged -= OnSourceChanged;
      if (IsTwoWayBinding) TargetDependency.DependencyChanged -= OnTargetChanged;

      //clear dependencies and references
      SourceDependency.Dispose();
      TargetDependency.Dispose();
      SourceDependency = null;
      TargetDependency = null;
    }