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