Найти не выбранный пункт в списке искры с множественным выбором - PullRequest
3 голосов
/ 03 августа 2010

В списке искр я могу использовать событие change, чтобы узнать, какой элемент был выбран или отменен. Отправленный объект IndexChangeEvent имеет свойства newIndex и oldIndex, содержащие эту информацию.

Но с возможностью множественного выбора это больше не работает, потому что newIndex и oldIndex могут ссылаться на индексы все еще выбранных элементов.

Решением было бы скопировать вектор selectedIndices в другую переменную и сравнить эту переменную с selectedIndices после изменения выбора, но это кажется несколько сложным.

Кто-нибудь знает, есть ли простой способ получить индекс / элемент, который пользователь отменяет, выбрав , пока другие элементы все еще выбраны?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2011

Вы также можете расширить свой пользовательский объект данных с помощью

  • связываемое логическое свойство: _selected, который обновляется через список взаимодействий.
  • и событие, которое можно запустить из это: selectionChanged.

В установщике selected - если он действительно изменился - вы можете запустить свое собственное всплывающее событие selectionChanged и захватить его там, где вам нужно.

SelectableItem.as - пользовательская структура данных, представляющая данные строки списка

[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%" />

Надеюсь, это поможет.

0 голосов
/ 30 марта 2011

Вам нужно будет сохранить выбранные политики и сравнить разницу.

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