Проблемы с Spark DropDownList как itemEditor в AdvancedDataGrid
Я пытаюсь использовать Spark DropDownList
как itemEditor
в AdvancedDataGrid. Но я наткнулся на две проблемы:
Нажатие на элемент в DropDownList изменяет выбранную строку в ADG. Вы можете увидеть это поведение, скомпилировав код снизу и выполнив следующие шаги.
- Откройте DropDownList, нажав на "A" в строке 1
- Выберите "C" с помощью мыши
Значение меняется с "A" на "C", и строка 3 - это выбранная строка в ADG. Похоже, что щелчок мыши в DropDownList также обрабатывается самим ADG, который соответствующим образом изменяет выбранную строку. Я не мог найти способ предотвратить это. Ожидаемое поведение будет состоять в том, что строка 1 по-прежнему будет выделена после закрытия DropDownList.
- Нажатие на полосу прокрутки 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>
2 ответа
Благодаря Эд я теперь нашел решение, которое, кажется, работает довольно хорошо. 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();
}
Я тоже видел эту проблему. Мое исправление состояло в том, чтобы добавить прослушиватель события для DropDownEvent.CLOSE в подкласс AdvancedDataGrid (вы должны убедиться, что ваш редактор правильно отправляет это событие).
Как только вы это сделаете, вы можете предотвратить запуск ADG mouseUpHandler и сами обработать вызов endEdit.