Drag n 'Drop spark List Itemrenders между компонентами - PullRequest
0 голосов
/ 20 марта 2011

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

Итак, давайте перейдем к делу.

  • Компонент A имеет List1
  • Компонент B имеет List2

Компонент A - Список 1 имеет dragEnabled="true" и mouseDown="initiateDrag(event)"

private function initiateDrag(e:MouseEvent):void{
    var dragInitiator:IUIComponent = e.target as IUIComponent;
    var de:DragSource = new DragSource;
    de.addData(dragInitiator, 'artist');
    DragManager.doDrag(dragInitiator, de, e);
}

По тому, что я прочитал, используя mouseDown, я запускаю событие перетаскивания, создавая, какие данные я собираюсь перетащить ... этоcase 'artist'

Компонент B - Список 2 имеет dropEnabled = "true", dragEnter = "dragEnterHandler (событие)" и dragDrop = "dragDropHandler (событие)«

private function dragEnterHandler(e:DragEvent):void{
    if(e.dragSource.hasFormat('artist')){
        DragManager.acceptDragDrop(List(e.currentTarget));
    }
}

Теперь, когда я перетаскиваю itemRender из списка Component A List 1 over Component B List 2, это , чтобы вызватьфункция dragEnterHandler(event), и это делает ... но я также ожидал, что DragManager.acceptDragDrop(List(e.currentTarget)) изменит индикатор с « красный крест » на « зеленый плюс » иd этого не происходит ... и из-за этого перетаскиваемый itemRender (proxi) возвращается к своему первоначальному списку, в этом случае он возвращается к Компоненту A List 1

Я уже потратилчасы и часы отлаживают и тестируют другие подходы, и ни один из них не работает для меня.

Кто-нибудь здесь знаком с перетаскиванием между компонентами, которое может мне помочь?

1 Ответ

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

Ну, ребята, похоже, что через 2 дня и через 4 часа я получил решение:)

Я смотрел на это совершенно неправильно. При использовании перетаскивания с компонентами на основе списка «format» всегда равен «itemsByIndex», и я пытался быть принятым с «Artist» «format».

Проблема: У вас есть несколько списков, принимающих данные методом перетаскивания. Разные списки должны принимать разные типы данных.

Решение: Оберните <s:List/> в <s:Group/> и вручную вызовите событие dragEnter, и с его помощью вы вызываете функцию, которая может принимать или отклонять перетаскиваемые данные, проверяя их 'format'. Принимая источник перетаскивания, отправляется событие dragDrop, с помощью которого вы можете вызвать функцию, которая сделает все, что вы хотите в своем приложении ... например, добавить перетаскиваемые данные в список.

Примечание: Помните, что если вы установите dragEnter и dragDrop непосредственно на компоненте, вы не сможете проверить «формат» перетаскиваемых данных, поскольку все элементы управления списком используют 'format' 'itemsByIndex'

Демо-версия:

<fx:Script>
    <![CDATA[

    private function dragEnterHandler(e:DragEvent):void{
        if(e.dragSource.hasFormat('artist')){
            var dropTarget:Group = Group(e.currentTarget);
            DragManager.acceptDragDrop(dropTarget);
        }
    }

    private function dragDropHandler(e:DragEvent):void{
            // Check is the data alreay exists in the list;
            // Adds the data to the list dataGroup;
            // Do whatever you want ...     
    }

    ]]>
</fx:Script>

<s:Group id="myGroup" 
         dragDrop="dragDropHandler(event)" 
         dragEnter="dragEnterHandler(event)">
    <s:List id="myList" 
                dataProvider="{myDataProvider}"/>
</s:Group>

Надеюсь, это поможет другим людям с такой же проблемой! :)

...