Flex: как я могу внести изменения в коллекцию ArrayCollection, привязанную к сетке данных, в реальном времени?

У меня есть ArrayCollection, привязанная к редактируемой DataGrid, другой компонент должен знать, когда ArrayCollection изменяется (в результате изменений в DataGrid), чтобы он также мог обновляться, поэтому он прослушивает событие COLLECTION_CHANGE ArrayCollection.

Проблема в том, что DataGrid обновляет ArrayCollection только тогда, когда редактируемая строка теряет фокус. Это не подходит для моего приложения, так как пользователь может редактировать столбец в строке и не щелкать в другом месте таблицы в течение длительного времени (в результате чего строка теряет фукус), поэтому изменения не распространятся на другие части приложение.

Как я могу заставить сетку данных информировать ArrayCollection об изменении каждый раз, когда на вводе текста происходит событие keyup, а не каждый раз, когда строка теряет фокус?

Ваше здоровье,

Крис


person ChrisInCambo    schedule 21.02.2010    source источник


Ответы (2)


Я бы добавил обработчик к компоненту, используемому для редактирования значения, а не к коллекции ArrayCollection. Пример:

<mx:DataGridColumn dataField="name" headerText="Name" itemEditor="{nameEditor}" editorDataField="selectedItem" />

Затем это используется для редактирования значения:

<mx:Component id="nameEditor">
    <mx:ComboBox dataProvider="{outerDocument.names}" change="outerDocument.setNameField(event)" close="outerDocument.setNameField(event)" />
</mx:Component>

А это обработчик события изменения (и закрытия):

public function setDestinationField(event:*):void {
    var destination:String = (event.target as ComboBox).selectedLabel;
    if (destination === '') {
        delete _gridData[_currentlyEditedRowIndex].destination;
    } else {
        _gridData[_currentlyEditedRowIndex].destination = destination;
    }
}

_currentlyEditedRowIndex устанавливается добавлением этого в сетку:

itemEditBegin="beginEdit(event);"
person Gabriel McAdams    schedule 21.02.2010

Спасибо, Габриэль, ты направил меня на правильный путь. Я опубликую здесь свое окончательное решение на случай, если кому-то еще понадобится сделать то же самое в будущем.

  <mx:DataGridColumn headerText="Title" width="300" dataField="title">
    <mx:itemEditor>
      <mx:Component>
        <mx:TextInput change="data.title = text" />
      </mx:Component>
    </mx:itemEditor>
  </mx:DataGridColumn>

Теперь всякий раз, когда текст во входных данных изменяется, ArrayCollection, используемая в качестве поставщика данных, также обновляется, поэтому другие компоненты прослушивают события COLLECTION_CHANGE.

person ChrisInCambo    schedule 21.02.2010