public override void OnInspectorGUI()
        {
            VMDataBinder binder = target as VMDataBinder;

            binder.EditorBind();

            if (definerDrawer == null)
            {
                definerDrawer = new DataDefinerDrawer(binder.Source);
            }
            definerDrawer.Draw(binder.BindVM, binder.BindData, typeof(StructType));

            binder.Template = (GameObject)EditorGUILayout.ObjectField("Template:", binder.Template, typeof(GameObject), true);
            if (binder.Template == null || binder.Template.GetComponent <VMBehaviour>() == null)
            {
                GUIStyle style = new GUIStyle(EditorStyles.boldLabel);
                style.normal.textColor = Color.red;
                if (binder.Template == null)
                {
                    EditorGUILayout.LabelField("template can not be null.", style);
                }
                else
                {
                    EditorGUILayout.LabelField("template game object must have VMBehaviour.", style);
                }
            }
        }
        public override void OnInspectorGUI()
        {
            ListDataBinder binder = target as ListDataBinder;

            binder.EditorBind();

            if (definerDrawer == null)
            {
                definerDrawer = new DataDefinerDrawer(binder.Source);
            }
            definerDrawer.Draw(binder.BindVM, binder.BindData, typeof(IList));

            binder.Template = (GameObject)EditorGUILayout.ObjectField("Template:", binder.Template, typeof(GameObject), true);
            if (binder.Template == null || binder.Template.GetComponent <ListTemplateBinder>() == null)
            {
                GUIStyle style = new GUIStyle(EditorStyles.boldLabel);
                style.normal.textColor = Color.red;
                if (binder.Template == null)
                {
                    EditorGUILayout.LabelField("template can not be null.", style);
                }
                else
                {
                    EditorGUILayout.LabelField("template game object must have ListTemplateBinder.", style);
                }
            }
            else
            {
                IData data = binder.Source.GetData(binder.BindVM);
                if (data != null && data is IListData)
                {
                    IListData list = (IListData)data;
                    if (list.Count <= 0)
                    {
                        GUIStyle style = new GUIStyle(EditorStyles.boldLabel);
                        style.normal.textColor = Color.red;
                        EditorGUILayout.LabelField("source list data must instantiate with one element at least.", style);
                    }
                    else
                    {
                        binder.Template.GetComponent <ListTemplateBinder>().ItemSource.Key = binder.Source.Key;
                    }
                }
            }

            binder.Optimize = EditorGUILayout.Toggle("Optimize:", binder.Optimize);
            if (binder.Optimize)
            {
                EditorGUI.BeginDisabledGroup(true);
                EditorGUILayout.ObjectField("Canvas:", binder.Canvas, typeof(Canvas), true);
                EditorGUILayout.ObjectField("ViewPort:", binder.ViewPort, typeof(RectTransform), true);
                EditorGUILayout.ObjectField("ScrollRect:", binder.ScrollRect, typeof(ScrollRect), true);
                EditorGUILayout.ObjectField("LayoutGroup:", binder.LayoutGroup, typeof(LayoutGroup), true);
                EditorGUILayout.IntField("PageRowsCount:", binder.PageRowsCount);
                EditorGUILayout.IntField("RowItemsCount:", binder.RowItemsCount);
                EditorGUILayout.IntField("StepRowsCount:", binder.StepRowsCount);
                EditorGUI.EndDisabledGroup();
            }
        }
        public override void OnInspectorGUI()
        {
            ListTemplateBinder binder = target as ListTemplateBinder;
            VMBehaviour        vm     = binder.GetComponentInParent <VMBehaviour>(true);

            if (definerDrawer == null)
            {
                definerDrawer = new DataDefinerDrawer(binder.ItemSource);
            }
            definerDrawer.Draw(vm, null, typeof(IList));

            IData     data = binder.ItemSource.GetData(vm);
            IListData list = data as IListData;

            if (list == null)
            {
                GUIStyle style = new GUIStyle(EditorStyles.boldLabel);
                style.normal.textColor = Color.red;
                EditorGUILayout.LabelField("no source list data.", style);
            }

            EditorGUILayout.LabelField("index: " + binder.Index);
        }