2013-03-18 5 views
0

Я использую DataGrid в одном из моих проектов, с обычаем ItemRenderer для одного столбца представляет логическое значение, как CheckBoxКак обрабатывать изменения в пользовательском GridItemRenderer

<s:DataGrid id="clients" resizableColumns="false"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="fullName" headerText="Client name" /> 
      <s:GridColumn dataField="active" headerText="Active?" width="90" 
          itemRenderer="CheckBoxGridItemRenderer"/> 
     </s:ArrayList> 
    </s:columns> 
</s:DataGrid> 

И здесь это код CheckBoxGridItemRenderer:

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

    <fx:Script> 
     <![CDATA[ 
      override public function prepare(hasBeenRecycled:Boolean):void { 
       checkBox.selected = Boolean(data[column.dataField]); 
      } 
     ]]> 
    </fx:Script> 

    <s:CheckBox id="checkBox" horizontalCenter="0" /> 

</s:GridItemRenderer> 

Теперь вот мой вопрос: Что такое лучший способ справиться с изменением данных из класса I объявлен DataGrid?

Я попытался изменить значение данных внутри моего пользовательского класса средства визуализации элементов:

private function valueChange():void 
{ 
    data.active = checkBox.selected; 
} 

[...] 

<s:CheckBox id="checkBox" change="valueChange()" /> 

, а затем слушать CollectionEvent.COLLECTION_CHANGE события на DataProvider в DataGrid, но я никогда не обрабатывать каких-либо изменений. Любые мысли или советы?

+0

Итак, вы хотите изменить данные из DataGrid? Попробуйте добавить в столбец 'rendererIsEitable =" true "'. – dvdgsng

+0

Это ничего не меняет. FYI Я уже могу изменить значение CheckBox без него. Но я хотел бы обработать связанное событие вне моего ItemRenderer, то есть в классе, в котором создан экземпляр DataGrid. – duTr

ответ

0

Как я нашел решение моей проблемы, я отправлю его здесь, но я оставляю вопрос открытым на какое-то время, если кто-то придумает лучший.

Сначала я создал CustomEvent (я мог бы использовать CollectionEvent класс, но таким образом, я уверен, что я не запутались с внутренней логикой DataGrid)

package 
{ 
    import flash.events.Event; 

    public class CustomEvent extends Event 
    { 
     public static const CHANGE:String = "change"; 

     public var column:String; 
     public var data:Object; 

     public function CustomEvent(column:String, data:Object) 
     { 
      super(CHANGE, true); 
      this.column = column; 
      this.data = data; 
     } 
    } 
} 

Обратите внимание на вызов super() с bubbles установлено значение true. Это действительно необходимо для того, чтобы событие было обработано здесь.

Тогда я изменил мой CheckBoxGridItemRenderer, чтобы отправить это событие, когда выбран/не выбран флажок:

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

    <fx:Script> 
     <![CDATA[ 
      import CustomEvent; 

      override public function prepare(hasBeenRecycled:Boolean):void { 
       if (data) 
       { 
        checkBox.selected = Boolean(data[column.dataField]); 
       } 
      } 

      private function valueChange():void 
      { 
       data[column.dataField] = checkBox.selected; 
       dispatchEvent(new CustomEvent(column.dataField, data)); 
      } 
     ]]> 
    </fx:Script> 

    <s:CheckBox id="checkBox" horizontalCenter="0" change="valueChange()" /> 
</s:GridItemRenderer> 

Наконец, я только слушать мое пользовательское событие, отправленного DataGrid например:

clients.addEventListener(CustomEvent.CHANGE, handleCustomEvent); 
0

Где вы измените данные. Когда элемент сбора данных изменился, DataGrid ничего не обнаруживает, если вы не отправляете CollectionEvent.COLLECTION_CHANGE для сбора данных. Кроме того, сбор данных должен быть чем-то вроде ArrayCollection, а не массивом.

+0

DataProvider DataGrid установлен в другом месте кода, и это ArrayCollection, но это не имеет ничего общего с мой вопрос. – duTr

+0

CollectionEvent.COLLECTION_CHANGE должен быть отправлен поставщику данных, иначе valueChanged() никогда не будет запущен. – John

+0

Если вы говорите о методе 'valueChange()', который я добавил в свой пользовательский элемент ItemRenderer, этот метод вызывается с успехом всякий раз, когда я нажимаю на 'CheckBox' – duTr