Come posso attivare un evento itemEditEnd in un elenco Flex quando la casella è selezionata / deselezionata?
-
21-08-2019 - |
Domanda
Ho un componente List
che ha drop-in CheckBox
itemEditor che serve anche come l'itemRenderer. Visualizza ogni elemento come un semplice <=> con un'etichetta.
Tuttavia, l'itemEditEnd Evento non ottiene attivato fino a quando clicco su qualcosa al di fuori della lista. Lo voglio attivato una volta che la casella è selezionata o deselezionata.
Stavo pensando di dispacciamento manualmente la ListEvent.ITEM_EDIT_END in un gestore di evento click, ma poi l'itemEditEnd evento sarebbe ottenere spedito due volte. Ci deve essere un modo migliore per farlo.
Tutte le idee?
Grazie.
Soluzione
Ecco la soluzione mi è venuta. Ho cambiato la mia lista per utilizzare il componente come un itemRenderer solo , non come un itemRenderer e itemEditor. Ho poi aggiunto un gestore MouseEvent.CLICK per chiamare una funzione nella lista dal itemRenderer per eseguire le azioni necessarie:
La mia lista dei componenti:
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...
}
}
}
Il mio 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);
}
}
}
Altri suggerimenti
Ho appena eseguito in questo. Io sto usando un componente personalizzato piuttosto che l'approccio drop-in, e questo funziona quando si utilizza il renderer come l'editor.
Si noti che la gente Flex evidentemente si avvicinò con l'idea che gli utenti vorrebbero passare le loro caselle di controllo un paio di volte prima di stabilirsi sullo stato di impegnarsi per ... a quel punto avevano colpito il tasto Invio. Come ovvio!
La mia soluzione è quella di sintetizzare un evento di tastiera che è equivalente a colpire Invio. La parte difficile è che si deve utilizzare il metodo callLater () per inviare l'evento perché il controllo elenco non avrà registrato il suo ascoltatore tastiera l'editor fino a dopo gestore click del casella di controllo viene chiamato. Ecco il mio gestore clicca per la casella di controllo nel mio renderer custom / componente editor di:
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)]);
}