代码之家  ›  专栏  ›  技术社区  ›  invertedSpear

在树控件中按索引获取项

  •  2
  • invertedSpear  · 技术社区  · 14 年前

    我正在使用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)”。

    谢谢 ~迈克

    编辑:我忘记发布我当前的解决方法是在得到node:xml之后设置selectedIndex=-1。我担心如果处理器上有什么问题,用户可能会看到它选择然后取消选择。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Michael Brewer-Davis    14 年前

    更简单的是,尽管可能会有:

    var index:int = ...
    var renderer:IListItemRenderer = tree.indexToItemRenderer(index);
    var item:Object = renderer.data;
    

    如果索引在屏幕外(因为可能没有活动的项渲染器),这将不起作用;不应该是拖放的问题。

        2
  •  0
  •   Michael Brewer-Davis    14 年前

    如果你 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、数组等),您可以考虑包装 数据提供者 在一个 XMLListCollection 或者你有什么机会接触到这个方法。


    上面的目标是正确的方向,但没有。

    结果你不想要 数据提供者 自从 Tree 覆盖;您需要 collection 属性(受保护)。所以您可以重写树并提供 indexToItem 方法与 thisToThat 方法已存在于 .