private void editDataSource(dfEventDrivenPropertyBinding binder)
    {
        using (dfEditorUtil.BeginGroup("Data Source"))
        {
            if (binder.DataSource == null)
            {
                binder.DataSource = new dfComponentMemberInfo();
            }

            var dataSource = binder.DataSource;

            var sourceComponent = dfEditorUtil.ComponentField("Component", dataSource.Component);
            if (sourceComponent != dataSource.Component)
            {
                dfEditorUtil.MarkUndo(binder, "Assign DataSource Component");
                dataSource.Component = sourceComponent;
            }

            if (sourceComponent == null)
            {
                EditorGUILayout.HelpBox("Missing component", MessageType.Error);
                return;
            }

            #region Edit property

            var sourceComponentMembers =
                getMemberList(sourceComponent)
                .Select(m => m.Name)
                .ToArray();

            var memberIndex   = findIndex(sourceComponentMembers, dataSource.MemberName);
            var selectedIndex = EditorGUILayout.Popup("Property", memberIndex, sourceComponentMembers);
            if (selectedIndex >= 0 && selectedIndex < sourceComponentMembers.Length)
            {
                var memberName = sourceComponentMembers[selectedIndex];
                if (memberName != dataSource.MemberName)
                {
                    dfEditorUtil.MarkUndo(binder, "Assign DataSource Member");
                    dataSource.MemberName = memberName;
                }
            }

            #endregion

            editSourceEvent(binder);

            EditorGUILayout.Separator();
        }
    }
    private void editSourceEvent(dfEventDrivenPropertyBinding binder)
    {
        var eventList = getEventList(binder.DataSource.Component).Select(x => x.Name).ToList();

        eventList.Insert(0, " ");

        var eventNameArray = eventList.ToArray();

        var sourceEventName = binder.SourceEventName ?? "";
        var selectedIndex   = findIndex(eventNameArray, sourceEventName);

        var index = EditorGUILayout.Popup("Change Event", selectedIndex, eventNameArray);

        if (index != selectedIndex)
        {
            dfEditorUtil.MarkUndo(binder, "Assign Source Event");
            binder.SourceEventName = index > 0 ? eventNameArray[index] : string.Empty;
        }
    }
    private void editTargetEvent( dfEventDrivenPropertyBinding binder )
    {
        var eventList = getEventList( binder.DataSource.Component ).Select( x => x.Name ).ToList();
        eventList.Insert( 0, " " );

        var eventNameArray = eventList.ToArray();

        var targetEventName = binder.TargetEventName ?? "";
        var selectedIndex = findIndex( eventNameArray, targetEventName );

        var index = EditorGUILayout.Popup( "Change Event", selectedIndex, eventNameArray );
        if( index != selectedIndex )
        {
            dfEditorUtil.MarkUndo( binder, "Assign Source Event" );
            binder.TargetEventName = index > 0 ? eventNameArray[ index ] : string.Empty;
        }
    }
    private void editDataSource( dfEventDrivenPropertyBinding binder )
    {
        using( dfEditorUtil.BeginGroup( "Data Source" ) )
        {

            if( binder.DataSource == null )
                binder.DataSource = new dfComponentMemberInfo();

            var dataSource = binder.DataSource;

            var sourceComponent = dfEditorUtil.ComponentField( "Component", dataSource.Component );
            if( sourceComponent != dataSource.Component )
            {
                dfEditorUtil.MarkUndo( binder, "Assign DataSource Component" );
                dataSource.Component = sourceComponent;
            }

            if( sourceComponent == null )
            {
                EditorGUILayout.HelpBox( "Missing component", MessageType.Error );
                return;
            }

            #region Edit property

            var sourceComponentMembers =
                getMemberList( sourceComponent )
                .Select( m => m.Name )
                .ToArray();

            var memberIndex = findIndex( sourceComponentMembers, dataSource.MemberName );
            var selectedIndex = EditorGUILayout.Popup( "Property", memberIndex, sourceComponentMembers );
            if( selectedIndex >= 0 && selectedIndex < sourceComponentMembers.Length )
            {
                var memberName = sourceComponentMembers[ selectedIndex ];
                if( memberName != dataSource.MemberName )
                {
                    dfEditorUtil.MarkUndo( binder, "Assign DataSource Member" );
                    dataSource.MemberName = memberName;
                }
            }

            #endregion

            editSourceEvent( binder );

            EditorGUILayout.Separator();

        }
    }