2013-03-18 58 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> 

現在,這裏是我的問題:什麼是處理從我宣佈DataGrid類數據的變化的最佳方式?

我試圖將數據值從我的自定義項目渲染類內變化:

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

[...] 

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

然後聽CollectionEvent.COLLECTION_CHANGE事件在DataGrid的數據提供程序,但我從來沒有處理任何變化。任何想法或建議?

+0

那麼,你想更改DataGrid中的數據嗎?嘗試在列中添加'rendererIsEditable =「true」'。 – dvdgsng 2013-03-18 03:22:48

+0

這不會改變任何東西。僅供參考,我已經可以在沒有它的情況下更改「CheckBox」值。但我想處理在我的ItemRenderer之外的相關事件,即在DataGrid實例化的類中 – duTr 2013-03-18 21:17:08

回答

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

你在哪裏改變數據。當數據收集元素髮生變化時,除非您爲數據收集派發CollectionEvent.COLLECTION_CHANGE,否則DataGrid不會檢測到任何內容。 另外,數據收集應該像ArrayCollection,而不是Array。

+0

DataGrid的dataProvider在代碼中的其他位置設置,它是一個ArrayCollection,但這與此無關我的問題。 – duTr 2013-03-18 01:56:55

+0

必須將CollectionEvent.COLLECTION_CHANGE分派給數據提供者,否則valueChanged()將永遠不會運行。 – John 2013-03-18 14:05:53

+0

如果您談論我在自定義的'ItemRenderer'中添加的'valueChange()'方法,那麼只要單擊'CheckBox',就會成功調用此方法。 – duTr 2013-03-18 21:13:54