Apache flex 柔性拖拽;Drop:检测所有数据何时从源移动到目标

Apache flex 柔性拖拽;Drop:检测所有数据何时从源移动到目标,apache-flex,events,flex3,event-handling,Apache Flex,Events,Flex3,Event Handling,我有两个mx:TileList控件,用于批量编辑对象。第一个包含所有可用数据的集合,第二个包含当前批次。两者都绑定到ArrayCollections,并且使用TileList控件的本机拖放功能,当在它们之间拖动对象时,数据将从一个ArrayCollection移动到另一个 当批次计数从0变为n或n变为0项目时,我需要更改currentState以显示并重置批次操作控件。基于,我本以为应该侦听dragComplete事件,但我的测试表明,它不是在数据从源ArrayCollection中删除并添加到

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

当批次计数从0变为nn变为0项目时,我需要更改
currentState
以显示并重置批次操作控件。基于,我本以为应该侦听
dragComplete
事件,但我的测试表明,它不是在数据从源ArrayCollection中删除并添加到目标ArrayCollection后触发,而是在这两个操作之间(一致地)触发

两个列表与此类似:

<mx:TileList 
    id="srcList" 
    dragEnabled="true" 
    dropEnabled="true" 
    dragMoveEnabled="true" 
    dataProvider="{images}"
    dragComplete="handleDragComplete(event)"
    allowMultipleSelection="true"
/>
最后,这里是运行代码的一些示例输出。这些都是一个接一个地运行的

案例1:

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

srcList.dragComplete: batch.length=1
srcList.dragComplete: images.length=10
(预计:1,9)

显然,该对象已添加到batch ArrayCollection,但未从源中删除

案例2:

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

srcList.dragComplete: batch.length=2
srcList.dragComplete: images.length=9
(预计:2,8)

首先,我们可以看到images.length已更改,表明在触发dragComplete事件后,我从源列表拖动到批列表的对象已被删除

这次也会发生同样的情况:新对象被添加到batch 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中发现错误了吗?

您能否侦听目标阵列集合上的collectionChange事件

batch.addEventListener(CollectionEvent.COLLECTION_CHANGE, handleBatchCollectionChange);

这是另一个对我很有效的解决方案

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"
/>
private函数dragBeginHandler():void{
stage.addEventListener(MouseEvent.MOUSE_UP,dragFinishHandler);
跟踪(“已开始拖放,已添加拖放完成侦听器”);
}
私有函数dragFinishHandler():void{
stage.removeEventListener(MouseEvent.MOUSE_UP,dragFinishHandler);
跟踪(“拖放完成,删除拖放完成侦听器”);
//在此处执行或打印任何您想执行的操作,此时将完成添加/删除操作
跟踪('dragComplete:batch.length='+batch.length.toString());
跟踪('dragComplete:images.length='+images.length.toString());
如果(batch.length>0){
currentState='show';
}否则{
当前状态=“”;
}
}

是的,这正是我需要的。非常感谢。我将把我的代码编辑到你的答案中。
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"
/>