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