public override void OnInspectorGUI()
        {
            base.OnInspectorGUI();

            Target = target as BindingBase;

            if (!Application.isPlaying)
                Target.FindContext();

            if (Target.Context == null)
            {
                EditorGUILayout.LabelField("BindingContext not found.");
                PropertyTextInputs();
            }
            else if (Target.Context.DataType == null)
            {
                EditorGUILayout.LabelField("BindingContext.DataType not found.");
                PropertyTextInputs();
            }
            else
            {
                Target.Init();

                foreach (var binding in Target.GetBindingInfos())
                {
                    if (binding.ShouldShow != null && !binding.ShouldShow())
                        continue;

                    PropertyDropDown(binding);
                }
            }
        }
        void PropertyDropDown(BindingBase.BindingInfo info)
        {
            var type = Target.Context.DataType;

            var members = new MemberInfo[0];

            var instance = Target.Context.DataInstance;

            Foundation.Databinding.Components.ObservableGameObject obsGO = instance as Foundation.Databinding.Components.ObservableGameObject;

            if(obsGO != null)
            {
                members = obsGO.GetMethods();
            }
            else
            {
                // filter
                switch (info.Filters)
                {
                    case BindingBase.BindingFilter.Commands:
                        members = EditorMembersHelper.GetMethods(type);
                        break;
                    case BindingBase.BindingFilter.Properties:
                        members = EditorMembersHelper.GetProperties(type);
                        break;
                }
            }

            //filter
            if (info.FilterTypes != null)
            {
                members = members.Where(o => info.FilterTypes.Any(t => ValidType(t, o.GetParamaterType()))).ToArray();
            }

            if (members.Length == 0)
            {
                EditorGUILayout.LabelField(string.Format("{0}->{1} has no valid members.", info.BindingName, type.Name));
                return;
            }

            var labels = members.Select(o => string.Format("{0} : {1}", o.Name, o.GetParamaterType())).ToList();

            var names = members.Select(o => o.Name).ToList();

            labels.Insert(0, "Null");
            names.Insert(0, "");

            var index = Array.IndexOf(names.ToArray(), info.MemberName);

            var i = EditorGUILayout.Popup(info.BindingName, index, labels.ToArray());

            if (i != index)
            {
                info.MemberName = names[i];
                EditorUtility.SetDirty(target);
            }
        }