2011-05-09 76 views
2

我正在處理彈性樹拖放功能,我有幾個問題。彈性樹拖動下降

我給出了一個數組集合作爲數據提供者。每個分支(文件夾)和葉子(item)都有一個唯一的ID。

樹結構是這樣的一些東西。

folder1. 
     folder2. 
      item1. 
      item2. 
      item3. 
     folder3. 
      item4. 
      item5. 
      item6. 
folder4. 
     item7. 
     item8. 
     folder5. 
      item9. 
      item10. 
folder6. 
     folder7. 
     folder8. 

我需要允許用戶拖放文件夾內的項目,但不在文件夾外。但他可以在任何地方拖放文件夾。

因此,用戶不能拖放項目文件夾1或文件夾4或文件夾6級別。

我在谷歌上找到了幾個例子......但沒有任何工作對我有利。

回答

2

以下是xml數據示例: 我使用mx_internal :: _ dropData屬性查找真正的父級。

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      minWidth="955" minHeight="600" 
      > 


<fx:Script> 
    <![CDATA[ 
     import mx.controls.Alert; 
     import mx.core.mx_internal; 
     import mx.events.DragEvent; 


     protected function myTree_dragDropHandler(event:DragEvent):void 
     { 
      /* 
      Pay attention at mx_internal namespace : 
      Behaviour could change in the next flex version. 
      Drop data structure. 
      _dropData = { 
       parent: parent, 
       index: index, 
       localX: event.localX, 
       localY: event.localY, 
       emptyFolder: emptyFolder, 
       rowHeight: rowHeight, 
       rowIndex: rowNum }; 
      */ 

      var parent:XML = myTree.mx_internal::_dropData.parent; 
      var draggedElement:XML = 
       (event.dragSource.dataForFormat("treeItems") as Array)[0]; 
      if (draggedElement.name() == "item" 
            && draggedElement.parent() != parent) { 
       // element is an item and parent is different => can not drop           
       event.preventDefault(); 
       myTree.hideDropFeedback(event); 
       Alert.show("can not drop"); 
      } 

      // you can also play with 
      // var dropIndex:int = myTree.calculateDropIndex(event); 
      // myTree.getItemIndex(dropIndex) 
      // but it is a little more complicated to find 
      // the real parent because we haven't drop indicator 
      // information (child or parent position). 

      // I did not use xml element id but it is also possible 
      // parent.id != draggedElement.parent().id 

     } 

    ]]> 
</fx:Script> 


<fx:Declarations> 
    <fx:XMLList id="treeData"> 
     <folder id="folder1" label="Folder 1"> 
      <folder id="folder2" label="Folder 2"> 
       <item id="item1" label="Item 1"/> 
       <item id="item2" label="Item 2"/> 
       <item id="item3" label="Item 3"/> 
      </folder> 
      <folder id="folder3" label="Folder 3"> 
       <item id="item4" label="Item 4"/> 
       <item id="item5" label="Item 5"/> 
      </folder> 
      <item id="item6" label="Item 6"/> 
      <item id="item7" label="Item 7"/> 
     </folder> 
    </fx:XMLList> 
</fx:Declarations> 

<mx:Tree id="myTree" 
     width="50%" height="100%" 
     labelField="@label" 
     dragEnabled="true" 
     dropEnabled="true" 
     dragMoveEnabled="true" 
     showRoot="true" 
     dataProvider="{treeData}" 
     dragDrop="myTree_dragDropHandler(event)"/> 


</s:Application>