我正在使用Adobe快速入门的一些帮助在树上执行拖放操作: http://www.adobe.com/devnet/flex/quickstart/working_with_tree/
建议的代码大致如下:
var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);
myTree.selectedIndex = i;
var node:XML = myTree.selectedItem as XML;
var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
DragManager.showFeedback(DragManager.NONE);
return;
}else{
DragManager.showFeedback(DragManager.COPY);
}
这一切都很好,但我不喜欢它选择(突出显示)我正在使用的树中的每个项目的方式,它不太清楚项目将在哪里下降。我想在没有选择的情况下实现它,但似乎没有办法仅使用索引来获取节点的XML。我想要这样的东西:
var dropTarget:Tree = Tree(evt.currentTarget);
var i:int = dropTarget.calculateDropIndex(evt);
var node:XML = myTree.itemAt(i) as XML;
//AFAIK itemAt(i) or anything like it does not exist
var drugXML:XML = XML(Tree(evt.dragInitiator).selectedItem);
if(node.localName() != drugXML.localName()){
DragManager.showFeedback(DragManager.NONE);
return;
}else{
DragManager.showFeedback(DragManager.COPY);
}
所以有人知道什么是函数,或者我可以做些什么来扩展树以具有函数,例如“itemAt(i)”
由于 〜麦克
编辑:我忘记发布我当前的解决方法是在获取节点后设置selectedIndex = -1:XML。我担心如果处理器出现问题,用户可能会看到它选择然后取消选择。
答案 0 :(得分:2)
更简单,虽然可能有问题:
var index:int = ...
var renderer:IListItemRenderer = tree.indexToItemRenderer(index);
var item:Object = renderer.data;
如果索引在屏幕外(因为可能没有活动的itemRenderer),这将不起作用;不应该是拖放的问题。
答案 1 :(得分:0)
如果您的dataProvider
明确或隐含地是一个集合(请参阅转换规则的链接文档),您应该能够使用getItemAt
来解析索引。
似乎隐式转换XML
提供商:
var tree:Tree = ...;
var data:XML = ...;
tree.dataProvider = data; // could just as well be from MXML
var provider:ICollectionView = tree.collection; // tree converted it for us
trace(provider.getItemAt(index));
如果您有除可转换类型(XML,数组等)以外的其他内容,您可以考虑将dataProvider
包裹在XMLListCollection
中,或者让您获得对该方法的访问权限。< / p>
以上是针对正确的方向但缺失。
原来你不希望dataProvider
覆盖Tree
;你想要collection
属性(受保护)。因此,您可以覆盖树并提供indexToItem
方法,以使用thisToThat
中已存在的Tree
方法。