private Node GetRelativeSource(Node target) { Node source = null; switch (RelativeSourceMode) { case RelativeSourceMode.Self: source = target.Parent; break; case RelativeSourceMode.FindAncestor: case RelativeSourceMode.SerializationContext: source = FindAncestor(target); break; case RelativeSourceMode.PreviousData: throw new NotImplementedException(); } return source; }
protected Node(Node parent) { Parent = parent; TargetBindings = new List<Func<object>>(); }
private Node FindAncestor(Node target) { int level = 1; Node parent = target.Parent; while (parent != null) { if (level == Level) return parent; if (parent.Parent == null && RelativeSourceMode == RelativeSourceMode.SerializationContext) return parent; parent = parent.Parent; if (!(parent is ContextValueNode)) level++; } return null; }