Exemple #1
0
        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);
        }
Exemple #2
0
 public PLayoutBinderHost(PVisual visual)
 {
     this.LogicalParent = visual;
 }
Exemple #3
0
        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);
        }