ОК, это не красиво и аккуратно, но работает.
Отработка некоторых примеров SOTC:
http://www.switchonthecode.com/tutorials/adding-dynamic-rows-to-flex-datagrid
В основном я использую две коллекции. Я расширил DataGrid и добавил другое свойство для sourceDataProvider. В установщике для этого я создаю новую коллекцию ArrayCollection для dataProvider, чтобы они больше не были «связаны». Я также звоню, чтобы добавить объект "заполнитель" для "Нажмите здесь, чтобы добавить" в dataProvider.
[Bindable]
public function get sourceDataProvider():ArrayCollection
{
return _sourceDataProvider;
}
public function set sourceDataProvider(value:ArrayCollection):void
{
_sourceDataProvider= value;
dataProvider = new ArrayCollection(value.source.concat());
addPlaceholderItem();
}
Когда itemEditor готов к фиксации значений, я просто вручную обновляю _sourceDataProvider. Не пытайтесь использовать сеттер, добавьте в личную копию. На данный момент элемент-заполнитель был отредактирован, поэтому нам нужно снова вызвать метод для создания фиктивного объекта.
public function editEnd(e:DataGridEvent):void
{
// Adding a new task
if(e.itemRenderer.data.condition != DUMMY_PLACEHOLDER_DATA && e.rowIndex == dataProvider.length - 1)
{
_sourceDataProvider.addItem(e.itemRenderer.data);
destroyItemEditor();
callLater(addPlaceholderItem);
e.preventDefault();
}
dataProvider.refresh();
}
Пожалуйста, имейте в виду, что я контролирую, когда editEnd вызывается в моем itemEditor. У меня есть нажатие кнопки запуска метода commitValues ().
private function commitValues():void
{
//change the "data" here
//force datagrid to endEdit
var grid:DataGrid = listData.owner as DataGrid;
if(grid)
{
grid.editedItemPosition = null;
grid.selectedIndex = -1;
}
}