Flex Drag&丢弃:检测所有数据何时从源移动到目标

时间:2009-10-05 15:38:13

标签: flex events flex3 event-handling

我有两个mx:TileList控件,我用它们来批量编辑对象。第一个包含所有可用数据的集合,第二个包含当前批次。两者都绑定到ArrayCollections,并且使用TileList控件的本机拖放功能,当在它们之间拖动对象时,数据从一个ArrayCollection移动到另一个。{/ p>

我需要更改currentState以显示&当批次计数从 0 变为 n n 0 项目时,重置批次操作控件。基于the documentation,我原本以为我应该听dragComplete事件,但我的测试显示,在从源ArrayCollection中删除数据并添加到目标ArrayCollection之后,不是触发,它会在这两个动作之间(持续)发射。

两个列表都与此类似:

<mx:TileList 
    id="srcList" 
    dragEnabled="true" 
    dropEnabled="true" 
    dragMoveEnabled="true" 
    dataProvider="{images}"
    dragComplete="handleDragComplete(event)"
    allowMultipleSelection="true"
/>

这是handleDragComplete函数的来源:

private function handleDragComplete(e:DragEvent):void{
    trace(e.dragInitiator.name + '.dragComplete: batch.length=' + batch.length.toString());
    trace(e.dragInitiator.name + '.dragComplete: images.length=' + images.length.toString());
    if (batch.length > 0){
        currentState = 'show';
    }else{
        currentState = '';
    }
}

最后,这是运行代码的一些示例输出。这些都是一个接一个地运行。

案例1:

应用程序在第一个列表中加载10个对象,批处理为空。我将1个对象从源列表拖到批处理列表中。

srcList.dragComplete: batch.length=1
srcList.dragComplete: images.length=10

(预计:1,9)

显然,该对象已添加到批处理ArrayCollection中,但未从源中删除。

案例2:

现在,我将第二个对象拖到批处理中。

srcList.dragComplete: batch.length=2
srcList.dragComplete: images.length=9

(预计:2,8)

首先,我们可以看到images.length已更改,显示我从源列表拖动到批处理列表的对象已被删除 AFTER 已触发的dragComplete事件。

这次发生同样的事情:新对象被添加到批处理ArrayCollection(batch.length = 2),dragComplete事件触发(运行这些跟踪),然后从源中删除对象ArrayCollection中。

案例3:

现在,我将把批处理列表中的两个图像拖回源列表中的原始位置。

batchList.dragComplete: batch.length=2
batchList.dragComplete: images.length=10

(预计:0,10)

我们可以看到batch.length没有下降,但源图像数组的原始长度为10。

问题:我做错了什么?还有其他我可以听的活动吗? (注意:我尝试了 DragExit DragDrop ,只是为了确定,这些行为符合预期,但不是什么我需要。)或者是否有另一种获取我想要的数据的方法?或者......我在SDK中发现了一个错误吗?

2 个答案:

答案 0 :(得分:1)

您可以在目标ArrayCollections上侦听collectionChange事件吗?

batch.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleBatchCollectionChange);

答案 1 :(得分:0)

这是另一个对我有用的解决方案。

private function dragBeginHandler():void {
    stage.addEventListener(MouseEvent.MOUSE_UP, dragFinishHandler);
    trace("Drag/drop started, Drag-completion listener added");
}

private function dragFinishHandler():void {
    stage.removeEventListener(MouseEvent.MOUSE_UP, dragFinishHandler);
    trace("Drag/drop finished, Drag-completion listener removed");

    //do or print whatever you want to do here, add/remove will be done by now
    trace('dragComplete: batch.length=' + batch.length.toString());
    trace('dragComplete: images.length=' + images.length.toString());

    if (batch.length > 0){
            currentState = 'show';
    }else{
            currentState = '';
    }
}

<mx:TileList 
        id="srcList" 
        dragStart="dragBeginHandler()"
        dragEnabled="true" 
        dropEnabled="true" 
        dragMoveEnabled="true" 
        dataProvider="{images}"
        dragComplete="handleDragComplete(event)"
        allowMultipleSelection="true"
/>