private bool BuildTarget(BuildStackTrace trace, DXMappingResult result, DXToken token, object obj, StringBuilder source) { bool isMultiline = false; var targetVisuals = new List <PVisual>(); if (obj is PTrigger trigger) { source.Replace( token.OriginalSource, "sender"); return(true); } if (obj is PLayoutBinderHost host) { targetVisuals.Add(host.LogicalParent); } if (obj is PSelector selector) { targetVisuals.Clear(); targetVisuals.SafeAdd(selector.TargetVisual); } if (obj is PDataBinding binding) { if (trace.GetFrame(0).Source.GetType() == typeof(PSetter)) { source.Clear(); source.Append("DXDatastore"); return(true); } } if (obj is PTargetable targetable) { // 연결됨 if (targetable.TargetBinder.Items.Count > 0) { string line = source.ToString(); IBinderHost[] hosts = targetable.TargetBinder.Items .Select(item => item.Host) .ToArray(); isMultiline = true; source.Clear(); for (int i = 0; i < hosts.Length; i++) { string tempLine = line; PVisual targetVisual = null; // 레이아웃에서 직접 연결 if (hosts[i] is PLayoutBinderHost targetLayoutHost) { targetVisual = targetLayoutHost.LogicalParent; } // 선택기로 가져옴 if (hosts[i] is PSelector targetSelector) { targetVisual = targetSelector.TargetVisual; } // Target을 해결하지 못한경우는 무조건 이벤트 sender if (targetVisual == null) { tempLine = tempLine.Replace(token.OriginalSource, "sender"); } else { // {Target} -> {Target:i} tempLine = tempLine.Replace(token.OriginalSource, $"{{{token.Token}:{i}}}"); targetVisuals.Add(targetVisual); } if (i > 0) { source.AppendLine(); } source.Append(tempLine); } } } for (int i = 0; i < targetVisuals.Count; i++) { if (this.NameContainer.ContainsValue(targetVisuals[i])) { string name = this.NameContainer[targetVisuals[i]].Trim('_'); string tokenSource = token.OriginalSource; if (isMultiline) { tokenSource = $"{{{token.Token}:{i}}}"; } source.Replace( tokenSource, name); } } if (targetVisuals.Count > 0) { return(true); } return(false); }
public PLayoutBinderHost(PVisual visual) { this.LogicalParent = visual; }
private bool BuildTarget(DXToken token, object obj, StringBuilder source) { PVisual targetVisual = null; if (obj is PLayoutBinderHost host) { targetVisual = host.LogicalParent; } if (obj is PSelector selector) { targetVisual = selector.TargetVisual; } if (obj is PTargetable targetable) { // 연결됨 if (targetable.TargetBinder.Items.Count > 0) { IBinderHost targetHost = targetable.TargetBinder.Items[0].Host; // 레이아웃에서 직접 연결 if (targetHost is PLayoutBinderHost targetLayoutHost) { targetVisual = targetLayoutHost.LogicalParent; } // 선택기로 가져옴 if (targetHost is PSelector targetSelector) { targetVisual = targetSelector.TargetVisual; } // Target을 해결하지 못한경우는 무조건 이벤트 sender if (targetVisual == null) { source.Replace(token.OriginalSource, "sender"); return(true); } } } if (this.NameContainer.ContainsValue(targetVisual)) { string name = this.NameContainer[targetVisual].Trim('_'); source.Replace( token.OriginalSource, name); return(true); } if (obj is PTrigger trigger) { source.Replace( token.OriginalSource, "sender"); return(true); } return(false); }