Проблемы с Spark DropDownList как itemEditor в AdvancedDataGrid

Я пытаюсь использовать Spark DropDownList как itemEditor в AdvancedDataGrid. Хауэрвер, я столкнулся с двумя проблемами:

  1. Щелчок по элементу в DropDownList изменяет выбранную строку в ADG. Вы можете увидеть это поведение, скомпилировав приведенный ниже код и выполнив следующие шаги.

    • Open the DropDownList by Clicking on "A" in Row 1
    • Выберите «C» с помощью мыши.

    Значение изменяется с «A» на «C», и строка 3 является выбранной строкой в ​​ADG. Похоже, что щелчок мышью в DropDownList также обрабатывается самим ADG, который соответственно изменяет выбранную строку. Я не мог придумать способ предотвратить это. Ожидаемое поведение будет заключаться в том, что строка 1 по-прежнему будет выбрана после закрытия DropDownList.

  2. Щелчок по полосе прокрутки DropDownList закрывает DropDownList. (Я только что нашел решение этой проблемы в связанных вопросах, когда писал это: Полосы прокрутки в раскрывающемся списке внутри DataGrid itemEditor не работают)

Применение

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

    <s:layout>
        <s:VerticalLayout horizontalAlign="center" verticalAlign="middle"/>
    </s:layout>

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable]
            private var myDataProvider:ArrayCollection = new ArrayCollection([
                {label: "Row 1", value: "A"},
                {label: "Row 2", value: "B"},
                {label: "Row 3", value: "C"},
                {label: "Row 4", value: "D"},
                ]);
        ]]>
    </fx:Script>

    <mx:AdvancedDataGrid dataProvider="{myDataProvider}" editable="true">
        <mx:columns>
            <mx:AdvancedDataGridColumn headerText="Label" dataField="label" width="150"/>
            <mx:AdvancedDataGridColumn headerText="Value" dataField="value" width="200" editorDataField="selectedItem"
                                       itemEditor="DropDownListEditor"/>
        </mx:columns>
    </mx:AdvancedDataGrid>
</s:Application>

ItemEditor

<?xml version="1.0" encoding="utf-8"?>
<s:MXAdvancedDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
                                  xmlns:mx="library://ns.adobe.com/flex/mx" focusEnabled="true"
                                  implements="mx.managers.IFocusManagerComponent">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;
            import mx.collections.IList;

            [Bindable]
            public var values:IList = new ArrayList(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
                "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]);

            public function get selectedItem():*
            {
                return dropDownList.selectedItem;
            }

            public override function setFocus():void
            {
                dropDownList.setFocus();
            }
        ]]>
    </fx:Script>

    <s:DropDownList id="dropDownList" top="2" left="2" right="2" bottom="2" dataProvider="{values}"
                    selectedItem="{listData.label}" open="dropDownList.skin['dropDown'].owner = this"/>
</s:MXAdvancedDataGridItemRenderer>

person Gerhard Schlager    schedule 11.03.2011    source источник


Ответы (2)


Я тоже видел эту проблему. Мое исправление заключалось в добавлении прослушивателя событий для DropDownEvent.CLOSE в подкласс AdvancedDataGrid (вы должны убедиться, что ваш редактор правильно отправляет это событие).

Получив это, вы можете предотвратить запуск ADG mouseUpHandler и самостоятельно обработать вызов endEdit.

person ed.    schedule 17.03.2011
comment
Спасибо за совет! Я не хотел менять ADG, поэтому еще раз посмотрел на все уволенные события. Поскольку вы упомянули mouseUpHandler ADG, это было хорошей отправной точкой для поиска решения (см. Мой собственный ответ). - person Gerhard Schlager; 18.03.2011

Благодаря Эду я нашел решение, которое работает вполне нормально. DropDownList использует событие MOUSE_DOWN для закрытия dropDown. Итак, dropDown больше не существует, когда запускается событие MOUSE_UP. Поэтому ADG получает событие MOUSE_UP и изменяет выбранную строку.

Сейчас я использую специальный DropDownList, в котором я подавляю первое событие MOUSE_UP, которое следует после закрытия dropDown. Пока это работает без проблем.

protected override function dropDownController_closeHandler(event:DropDownEvent):void
{
    systemManager.getSandboxRoot().addEventListener(MouseEvent.MOUSE_UP, systemManager_mouseUpHandler, true);
    super.dropDownController_closeHandler(event);
}

protected function systemManager_mouseUpHandler(event:MouseEvent):void
{
    systemManager.getSandboxRoot().removeEventListener(MouseEvent.MOUSE_UP, systemManager_mouseUpHandler, true);
    event.stopImmediatePropagation();
}
person Gerhard Schlager    schedule 18.03.2011