我在我的某个项目中使用DataGrid
,其中一列的自定义ItemRenderer
表示布尔值为CheckBox
<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()" />
然后在DataGrid的dataProvider上监听CollectionEvent.COLLECTION_CHANGE
事件,但我从不处理任何更改。有什么想法或建议吗?
答案 0 :(得分:0)
您在哪里更改数据。当数据收集元素发生更改时,除非为数据收集调度CollectionEvent.COLLECTION_CHANGE,否则DataGrid无法检测到任何内容。 此外,数据收集应该类似于ArrayCollection,而不是Array。
答案 1 :(得分: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);