2010-08-03 9 views
3

Dans une liste d'étincelles, je pourrais utiliser l'événement change pour savoir quel élément a été sélectionné ou désélectionné. L'objet expédié IndexChangeEvent a les propriétés newIndex et oldIndex détenant cette information.Découvrez un élément désélectionné dans la liste d'étincelles avec sélection multiple

Mais avec une sélection multiple autorisée cela ne fonctionne plus car newIndex et oldIndex pourraient se référer aux indices des éléments encore sélectionnés. Une solution serait de copier le vecteur selectedIndices dans une autre variable et de comparer cette variable avec selectedIndices après un changement dans la sélection, mais cela semble quelque peu complexe.

Est-ce que quelqu'un sait s'il existe un moyen facile d'obtenir deux l'index/élément d'un utilisateur est désélectionnant alors que d'autres éléments sont encore sélectionnés?

+0

IndexChangeEvent n'est pas un événement documenté dans la liste Spark, l'utilisation de la modification ou de la modification est probablement préférable. Cela dit, je n'ai pas de solution facile pour vous. Je m'attendais w/allowMultipleSelection activé que newIndex et oldIndex contiendraient les tableaux selectedIndices. Déposer une demande d'amélioration sur bugs.adobe.com – JeffryHouser

Répondre

0

Vous devrez stocker les Indicateurs sélectionnés et comparer la différence.

private static function findMissing(ar1:Array, ar2:Array):Array 
{ 
    var missing:Array = []; 
    for each(var item:Object in ar1) 
    { 
     if(ar2.indexOf(item) < 0) 
      missing.push(item); 
    } 

    return missing; 
} 
0

Vous pouvez également étendre votre objet de données personnalisées avec

  • une propriété booléenne bindable: _selected, qui est mise à jour via les interactions de la liste.
  • et un événement qui peut être déclenché à partir de it: selectionChanged.

Dans le selected setter - si elle a effectivement changé - vous pouvez tirer votre propre événement bouillonnement selectionChanged, et capturer partout où vous avez besoin.

SelectableItem.as - la structure de données personnalisée représentant des données de ligne de la liste

[Bindable] 
[Event(name="selectionChanged",type="flash.events.Event")] 
public class SelectableItem 
{ 
    public static const EVENT_SELECTION_CHANGED:String = 'selectionChanged'; 
    private var _selected:Boolean; 
    private var _name:String; 

    public function SelectableItem() 
    { 
    } 

    public function get selected():Boolean 
    { 
     return _selected; 
    } 

    public function set selected(value:Boolean):void 
    { 
     if (_selected != value) 
     { 
      _selected = value; 
      dispatchEvent(new Event(EVENT_SELECTION_CHANGED, true)); 
     } 
    } 

    public function get name():String 
    { 
     return _name; 
    } 

    public function set name(value:String):void 
    { 
     _name = value; 
    } 
} 

MyDataGrid.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:DataGrid xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    allowMultipleSelection="true"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.listClasses.IListItemRenderer; 

      protected override function updateRendererDisplayList(r:IListItemRenderer):void 
      { 
       super.updateRendererDisplayList(r); 
       if (r && r.data) 
        r.data.selected = DataGrid(r.owner).isItemSelected(r.data); 
      } 

     ]]> 
    </fx:Script> 
</mx:DataGrid> 

TestApplication.mxml

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 

     [Bindable] 
     private var list:ArrayCollection = new ArrayCollection(); 

     protected function onCreationComplete(event:FlexEvent):void 
     { 
      for (var i:int = 0; i < 20; i++) 
      { 
       var item:SelectableItem= new SelectableItem(); 
       item.name = 'Item ' + i; 
       item.addEventListener(SelectableItem.EVENT_SELECTION_CHANGED, onItemSelectionChanged); 
       list.addItem(item); 
      } 
     } 

     private function onItemSelectionChanged(event:Event):void 
     { 
      trace(event); 
     } 

    ]]> 
</fx:Script> 
<my:MyDataGrid dataProvider="{list}" width="100%" height="100%" /> 

J'espère que cela aide.