Гибкое перетаскивание и изменение порядка элементов управления HorizontalList - Поиск индексов FROM и TO? - PullRequest
0 голосов
/ 07 мая 2009

У меня есть проект Flex3 с 2 элементами управления HorizontalList; один из которых с включенным перетаскиванием. Оба элемента управления всегда будут иметь одинаковое количество элементов и связаны ... индекс 0 из 1-го элемента управления совпадает с индексом 0 из 2-го элемента управления и т. Д.

Естественно, при использовании перетаскивания для изменения порядка второго элемента управления я хочу, чтобы элементы первого элемента отражали то же изменение порядка. Я думаю, что могу справиться с фактическим обновлением элемента управления, но у меня возникают проблемы с поиском индексов от и до элемента, который был перемещен с помощью перетаскивания.

Использование метода dragDrop в элементе управления, который позволяет перетаскивать, и просмотр содержимого event.currentTarget (вместо event.target , потому что в документах написано так ) в отладчике, отображается общедоступный свойство с именем selectedIndex, которое, похоже, содержит из индекса , но я не вижу никаких свойств, которые бы указывали мне индекс до .

Я смотрю на собственность? Должен ли я сделать вывод, основываясь на чем-то другом? Есть ли лучший способ сделать это?

update: Приемлемым решением также может быть перебор содержимого HorizontalList и сохранение значения внутреннего индекса в массиве, который затем можно будет использовать для повторной сортировки dataProvider для другого списка; но я не могу понять, как перебирать содержимое списка, поэтому я так же застрял. Любая помощь там?

Вот мой код:

main.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    xmlns:com="components.*"
    layout="absolute" 
>
    <mx:Script>
        <![CDATA[
            import mx.events.DragEvent;
            import mx.controls.Alert;
            import mx.collections.ArrayCollection;

            //these two variables are junk data to represent 
            //what we will get back from our data services...
            [Bindable] 
            private var btnData:ArrayCollection = new ArrayCollection(
                [
                    {title:'title1', index:0},
                    {title:'title2', index:1},
                    {title:'title3', index:2},
                    {title:'title4', index:3}
                ]
            );
            [Bindable] 
            private var chainData:ArrayCollection = new ArrayCollection(
                [
                    {tmp:'testing 1'},
                    {tmp:'testing 2'},
                    {tmp:'testing 3'},
                    {tmp:'testing 4'}
                ]
            );

            //handle button re-ordering
            private function handleBtnReorder(event:DragEvent):void{
                Alert.show(event.action.toString());
            }
        ]]>
    </mx:Script>

    <mx:HorizontalList
        id="ChainView"
        dataProvider="{chainData}"
        itemRenderer="components.ItemRenderers.ChainLinkRenderer"
        left="20"
        right="20"
        top="20"
        height="300"
        rowHeight="300"
        columnWidth="500"
        rollOverColor="#ffffff"
        selectionColor="#eeeeee"
    />

    <mx:HorizontalList 
        id="btnList" 
        dataProvider="{btnData}"
        dragEnabled="true" 
        dropEnabled="true"
        dragMoveEnabled="true"
        dragDrop="handleBtnReorder(event)"
        itemRenderer="components.ItemRenderers.BtnListRenderer"
        horizontalCenter="true"
        left="20"
        right="20"
        top="320"
        height="50"
        rowHeight="35"
        rollOverColor="#ffffff"
        selectionColor="#ffffff"
    />

</mx:Application>

Alert.show(...) не для того, чтобы показать что-либо полезное, я установил точку останова на этой строке, чтобы я мог проверить аргумент события.

Я не думаю, что пользовательские itemRenderer важны (пока что для них не так много кода), поэтому я опущу их для краткости. Если вы думаете, что они важны, дайте мне знать, и я отредактирую их здесь.

Ответы [ 2 ]

2 голосов
/ 07 мая 2009

Оказывается, решение было переключиться с использования события dragDrop на событие dragComplete; в этот момент связанный поставщик данных был обновлен, чтобы отразить переупорядочение.

0 голосов
/ 12 февраля 2010

Вот почему шаблон локатора модели создан для!

Вы должны переместить ваш dataProvider в одноэлементный класс (например, модель), чтобы ваши средства визуализации элементов могли легко получить к нему доступ. Нет никакого смысла в том, что ваш элемент имеет свойство Index, поскольку он уже задан [ArrayCollection] .getItemIndex (..)

...