在树控件中按索引获取项目

时间:2010-01-20 17:18:07

标签: flex actionscript-3 tree

我正在使用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。我担心如果处理器出现问题,用户可能会看到它选择然后取消选择。

2 个答案:

答案 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方法。