Come posso attivare un evento itemEditEnd in un elenco Flex quando la casella è selezionata / deselezionata?

StackOverflow https://stackoverflow.com/questions/1064716

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.

È stato utile?

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)]); 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top