2009-06-30 16 views
2

私はListコンポーネントを持っています。これはドロップダウンCheckBox itemEditorを持ち、itemRendererとしても機能します。各項目はラベル付きの簡単なCheckBoxとして表示されます。CheckBoxがチェックされているかチェックされていないときにFlex ListでitemEditEndイベントをトリガーするにはどうすればよいですか?

しかし、リストの外にあるものをクリックするまで、itemEditEndイベントはトリガーされません。 CheckBoxがチェックされているかチェックされていない場合にトリガーしたいです。

CLICKイベントハンドラで手動でListEvent.ITEM_EDIT_ENDをディスパッチすることを考えていましたが、itemEditEndイベントが2回送出されるようになりました。これを行うにはより良い方法が必要です。

アイデア?

ありがとうございました。

+0

論理的に、チェックボックスのインターフェイスは、編集の終了を表すものではありません。あなたは気を付け直して再度クリックすることができます表現されたブール値をトグルします。編集の終了は(理想的には)何らかの形で、編集を開始する操作と対称でなければなりません。リストのチェックボックスをクリックするだけです。 –

答えて

2

ここに私が思いついた解決策があります。 ItemRendererとしてコンポーネントを使用するようにListを変更しましたのみ、itemRendererおよびitemEditorとしてではありません。

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

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); 
     } 
    } 
} 
0

I私はその後、必要なアクションを実行するためのitemRendererから一覧で関数を呼び出すためにMouseEvent.CLICKハンドラを追加しましたこれにぶつかるだけです。私はドロップインアプローチではなくカスタムコンポーネントを使用しています。これはレンダラーをエディターとして使用するときに機能します。

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)]); 
} 
関連する問題