0

プロジェクトの 1 つでを使用しており、列の 1 つでブール値を表すDataGridカスタムを使用しています。ItemRendererCheckBox

<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

問題の解決策を見つけたので、ここに投稿しますが、誰かがより良い解決策を思いついた場合に備えて、しばらくの間質問を開いたままにします.

最初に を作成しました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;
        }
    }
}

truesuper()に設定された への呼び出しに注意してください。bubblesこれは、イベントをここで処理するために実際に必要です。

次に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 に答える
0

どこでデータを変更しますか。データ コレクションの要素が変更された場合、データ コレクションに対して CollectionEvent.COLLECTION_CHANGE をディスパッチしない限り、DataGrid は何も検出できません。さらに、データ コレクションは、Array ではなく、ArrayCollection のようなものにする必要があります。

于 2013-03-18T01:19:16.817 に答える