0

我在我的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()" />

然后CollectionEvent.COLLECTION_CHANGE在 DataGrid 的 dataProvider 上收听事件,但我从不处理任何更改。有什么想法或建议吗?

4

2 回答 2

0

你在哪里更改数据。当数据集合的元素发生更改时,除非您为数据集合调度 CollectionEvent.COLLECTION_CHANGE,否则 DataGrid 无法检测到任何内容。此外,数据集合应该是 ArrayCollection 之类的,而不是 Array。

于 2013-03-18T01:19:16.817 回答
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);
于 2013-03-19T09:37:17.653 回答