2009-06-30 63 views
2

我有一個List組件,它有一個drop-in CheckBox itemEditor也可以作爲itemRenderer。它將每個項目顯示爲帶有標籤的簡單CheckBox當複選框被選中/取消選中時,如何觸發Flex列表中的itemEditEnd事件?

但是,itemEditEnd事件不會被觸發,直到我點擊列表之外的某個東西。我希望在複選框被選中或未選中時觸發它。

我想在CLICK事件處理程序中手動調度ListEvent.ITEM_EDIT_END,但是itemEditEnd事件會被調度兩次。有一個更好的方法來做到這一點。

任何想法?

謝謝。

+0

從邏輯上講,該複選框接口是這樣的,點擊它並不代表編輯結束 - 你可能會改變主意,再次點擊就可以了,切換表示的布爾值。編輯結束時(理想情況下)應該與開始編輯的操作以某種方式對稱 - 只需單擊列表中的複選框即可。 – 2009-06-30 16:56:58

回答

2

這是我提出的解決方案。我更改了我的列表以將該組件用作itemRenderer 而不是,而不是itemRenderer和itemEditor。然後我添加了一個MouseEvent.CLICK處理程序調用列表中的某個函數從itemRenderer的執行必要的行動:

我的列表組件:

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

我我剛剛遇到了這個。我使用的是自定義組件,而不是使用插入式方法,並且在使用渲染器作爲編輯器時可以使用。

請注意,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)]); 
} 
相關問題