/// <summary> /// Get the paths to all target properties through the nesting hierarchy. /// </summary> /// <returns>A list of paths to the properties.</returns> public List <TargetPath> GetTargetPropertyPaths() { var list = new List <TargetPath>(); var objList = GetTargetObjectsAndProperties(); foreach (var info in objList) { if (info.IsEndpoint) { TargetPath path = new TargetPath(info); list.Add(path); } else { foreach (var path in ((INestedMarkupExtension)info.TargetObject).GetTargetPropertyPaths()) { // Push the ITargetMarkupExtension path.AddStep(info); // Add the tuple to the list list.Add(path); } } } return(list); }
/// <summary> /// Trigger the update of the target(s). /// </summary> /// <param name="targetPath">A specific path to follow or null for all targets.</param> /// <returns>The output of the path at the endpoint.</returns> public object UpdateNewValue(TargetPath targetPath) { if (targetPath == null) { // No path supplied - send it to all targets. foreach (var path in GetTargetPropertyPaths()) { // Call yourself and supply the path to follow. UpdateNewValue(path); } } else { // Get the info of the next step. TargetInfo info = targetPath.GetNextStep(); // Get the own formatted output. object output = FormatOutput(targetPath.EndPoint, info); // Set the property of the target to the new value. SetPropertyValue(output, info, false); // Have we reached the endpoint? // If not, call the UpdateNewValue function of the next ITargetMarkupExtension if (info.IsEndpoint) { return(output); } else { return(((INestedMarkupExtension)info.TargetObject).UpdateNewValue(targetPath)); } } return(null); }