void RebuildModifyReorderableList()
        {
            lockerDict.Clear();
            var wrapper = viewPageItem.overrideDatas.Select(m => new ViewElementPropertyOverrideDataWrapper(m)).ToList();

            reorderableListViewModify = new ReorderableList(wrapper, typeof(List <ViewElementPropertyOverrideDataWrapper>), true, false, false, true);
            reorderableListViewModify.displayRemove = false;
            reorderableListViewModify.elementHeight = EditorGUIUtility.singleLineHeight * 2.5f;
            reorderableListViewModify.drawElementBackgroundCallback += (Rect rect, int index, bool isActive, bool isFocused) =>
            {
                Rect oddRect = rect;
                oddRect.x     -= 20;
                oddRect.width += 100;

                if (isFocused)
                {
                    ReorderableList.defaultBehaviours.DrawElementBackground(rect, index, isActive, isFocused, true);
                    return;
                }

                if (index % 2 == 0)
                {
                    GUI.Box(oddRect, GUIContent.none, Drawer.oddStyle);
                }
            };

            reorderableListViewModify.elementHeightCallback += (index) =>
            {
                return(wrapper[index].lineHeight);
            };
            reorderableListViewModify.drawElementCallback += (rect, index, isActive, isFocused) =>
            {
                var item = wrapper[index];
                rect.width -= 20;
                var ori_Rect = rect;
                rect.y     += EditorGUIUtility.singleLineHeight * 0.25f;
                rect.height = EditorGUIUtility.singleLineHeight;

                var removeBtnRect = ori_Rect;
                removeBtnRect.x    += removeBtnRect.width + 3;
                removeBtnRect.width = 20;
                if (GUI.Button(removeBtnRect, EditorGUIUtility.FindTexture("d_Toolbar Minus"), removeButtonStyle))
                {
                    viewPageItem.overrideDatas.RemoveAll(m => m == item.viewElementPropertyOverrideData);
                    RebuildModifyReorderableList();
                }


                var targetObject = viewPageItem.viewElement.transform.Find(item.viewElementPropertyOverrideData.targetTransformPath);

                if (targetObject == null)
                {
                    if (!lockerDict.ContainsKey(index))
                    {
                        lockerDict.Add(index, true);
                    }

                    float lineWidth = rect.width;
                    GUI.Label(rect, new GUIContent($"Target GameObject is Missing : [{viewPageItem.viewElement.name }/{item.viewElementPropertyOverrideData.targetTransformPath }", Drawer.miniErrorIcon));
                    rect.y           += EditorGUIUtility.singleLineHeight;
                    rect.width        = 16;
                    lockerDict[index] = EditorGUI.Toggle(rect, lockerDict[index], new GUIStyle("IN LockButton"));
                    rect.x           += 16;
                    rect.width        = lineWidth - 16;
                    using (var disable = new EditorGUI.DisabledGroupScope(lockerDict[index]))
                    {
                        item.viewElementPropertyOverrideData.targetTransformPath = EditorGUI.TextField(rect, item.viewElementPropertyOverrideData.targetTransformPath);
                    }

                    return;
                }

                if (string.IsNullOrEmpty(item.viewElementPropertyOverrideData.targetComponentType))
                {
                    GUI.Label(rect, new GUIContent($"Target Component is Missing ", Drawer.miniErrorIcon));
                    return;
                }

                UnityEngine.Object targetComponent = null;
                if (item.viewElementPropertyOverrideData.targetComponentType.Contains("UnityEngine.GameObject"))
                {
                    targetComponent = targetObject.gameObject;
                }
                else
                {
                    targetComponent = ViewSystemUtilitys.GetComponent(targetObject, item.viewElementPropertyOverrideData.targetComponentType);
                }

                if (targetComponent == null)
                {
                    rect.x     += 10;
                    rect.width -= 10;
                    GUI.Label(rect, new GUIContent($"ComponentType : [{item.viewElementPropertyOverrideData.targetComponentType}] is missing!", Drawer.miniErrorIcon));
                    rect.y += rect.height;
                    GUI.Label(rect, new GUIContent($"Use Toolbar>Verifiers>Verify Override to fix the problem."));
                    rect.y += rect.height;
                    if (GUI.Button(rect, new GUIContent("Remove item!")))
                    {
                        viewPageItem.overrideDatas.RemoveAll(m => m == item.viewElementPropertyOverrideData);
                        RebuildModifyReorderableList();
                    }
                    item.lineHeight = EditorGUIUtility.singleLineHeight * 3 + 5;
                    return;
                }
                var _cachedContent = new GUIContent(EditorGUIUtility.ObjectContent(targetComponent, targetComponent.GetType()));
                _cachedContent.tooltip = _cachedContent.text;
                var so = new SerializedObject(targetComponent);
                var sp = so.FindProperty(item.viewElementPropertyOverrideData.targetPropertyName);

                rect.width = 20;
                GUI.Label(rect, Drawer.prefabIcon);
                rect.x += rect.width;
                string     path = target.name + (string.IsNullOrEmpty(item.viewElementPropertyOverrideData.targetTransformPath) ? "" : ("/" + item.viewElementPropertyOverrideData.targetTransformPath));
                GUIContent l    = new GUIContent(path, path);
                rect.width = GUI.skin.label.CalcSize(l).x;
                GUI.Label(rect, l);
                rect.x += rect.width;

                rect.width = 20;
                GUI.Label(rect, Drawer.arrowIcon);
                rect.x += rect.width;

                rect.width = GUI.skin.label.CalcSize(_cachedContent).x;;
                GUI.Label(rect, _cachedContent);

                rect.y     += EditorGUIUtility.singleLineHeight;
                rect.height = EditorGUIUtility.singleLineHeight;
                rect.width  = ori_Rect.width;
                rect.x      = ori_Rect.x;

                //EditorGUI.PropertyField(rect, sp);
                if (VS_EditorUtility.SmartOverrideField(rect, sp, item.viewElementPropertyOverrideData.Value, out float lh))
                {
                }
                item.lineHeight = lh;
                //var result = EditorGUICM.GetPropertyType(sp);
            };
        }