2

itemRenderer としても機能するListドロップイン itemEditor を持つコンポーネントがあります。各アイテムをラベル付きCheckBoxのシンプルなものとして表示します。CheckBox

ただし、リストの外側の何かをクリックするまで、itemEditEnd イベントはトリガーされません。CheckBox がオンまたはオフになったらトリガーしたい。

CLICK イベント ハンドラーで ListEvent.ITEM_EDIT_END を手動でディスパッチすることを考えていましたが、itemEditEnd イベントが 2 回ディスパッチされます。これを行うにはもっと良い方法があるはずです。

何か案は?

ありがとう。

4

2 に答える 2

2

これが私が思いついた解決策です。コンポーネントをitemRenderer および itemEditor としてではなく、itemRendererのみとして使用するようにリストを変更しました。次に、MouseEvent.CLICK ハンドラーを追加して、必要なアクションを実行するために itemRenderer から List 内の関数を呼び出します。

マイ リスト コンポーネント:

package
{
    import mx.controls.List;
    import mx.core.ClassFactory;

    public class CustomCheckBoxList extends List
    {
        public function CustomCheckBoxList()
        {
            super();

            itemRenderer = new ClassFactory(CheckBoxRenderer);
        }

        public function dispatchSelectionEvent(item:Object, selected:Boolean):void
        {
            // Take action here...
        }
    }
}

私のItemRenderer:

package
{
    import flash.events.MouseEvent;

    import mx.controls.CheckBox;

    public class CheckBoxRenderer extends CheckBox
    {
        public function CheckBoxRenderer()
        {
            super();
        }

        override protected function clickHandler(event:MouseEvent):void
        {
            super.clickHandler(event);

            CustomCheckBoxList(listData.owner).dispatchSelectionEvent(data, selected);
        }
    }
}
于 2009-07-15T21:15:37.840 に答える
0

私はちょうどこれに遭遇しました。ドロップインアプローチではなくカスタムコンポーネントを使用しています。これは、レンダラーをエディターとして使用する場合に機能します。

Flexの人々は明らかに、ユーザーがコミットする状態に落ち着く前にチェックボックスを数回切り替えたいという考えを思いついたことに注意してください...その時点でEnterキーを押します。なんて明白なことでしょう。

私の解決策は、Enterキーを押すのと同じキーボードイベントを合成することです。トリッキーな部分は、callLater()メソッドを使用してイベントをディスパッチする必要があることです。これは、チェックボックスのクリックハンドラーが呼び出されるまで、リストコントロールがキーボードリスナーをエディターに登録しないためです。カスタムレンダラー/エディターコンポーネントのチェックボックスのクリックハンドラーは次のとおりです。

private function onClick(value:Object):void {
    newValue = value;
    var list:ListBase = ListBase(owner);
    list.callLater(dispatchEvent, [new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.ENTER, Keyboard.ENTER)]); 
}
于 2009-12-02T05:22:59.370 に答える