Comment puis-je déclencher un événement itemEditEnd dans une liste Flex lorsque la case est cochée / décochée?

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

Question

J'ai un composant qui a List goutte-à itemEditor qui sert CheckBox aussi la itemRenderer. Il affiche chaque élément comme un simple avec une étiquette <=>.

Cependant, l'événement itemEditEnd ne se déclenche jusqu'à ce que je ne pas cliquer sur quelque chose en dehors de la liste. Je veux déclenché une fois que la case est cochée ou décochée.

Je pensais à l'envoi manuellement ListEvent.ITEM_EDIT_END en un clic gestionnaire d'événements, mais l'événement itemEditEnd recevrais expédié deux fois. Il doit y avoir une meilleure façon de le faire.

Toutes les idées?

Merci.

Était-ce utile?

La solution

Voici la solution que je suis venu avec. J'ai changé ma liste pour utiliser le composant comme itemRenderer uniquement , non pas comme un itemRenderer et itemEditor. J'ai ensuite ajouté un gestionnaire MouseEvent.CLICK pour appeler une fonction dans la liste de la itemRenderer pour effectuer les actions nécessaires:

Ma liste de composants:

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...
        }
    }
}

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

Autres conseils

J'ai couru juste dans ce. J'utilise un composant personnalisé plutôt que l'approche d'abandon scolaire dans, et cela fonctionne lorsque vous utilisez le moteur de rendu comme l'éditeur.

Notez que les gens Flex évidemment venu avec l'idée que les utilisateurs veulent passer leurs cases à quelques reprises avant de s'installer sur l'état de s'engager à ... à quel point ils avaient frappé la touche Entrée. Comment évident!

Ma solution est de synthétiser un événement de clavier qui équivaut à frapper Entrée. La partie la plus délicate est que l'on doit utiliser la méthode callLater () pour envoyer l'événement parce que le contrôle de la liste ne sera pas avoir enregistré ses auditeurs du clavier sur l'éditeur jusqu'à ce que le gestionnaire de clic de la case à cocher est appelée. Voici mon gestionnaire de clic pour la case à cocher dans mon moteur de rendu personnalisé / composant éditeur:

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)]); 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top