2010-02-09 64 views
2

我有一个树形控件,在我放下一个项目(更新数据提供者)之后,我希望它保持打开状态。我尝试了很多东西,包括this question的示例,这些示例我无法工作,所以我正在做一些我觉得更基本的事情。像这样:Flex Tree没有重新扩展

[Bindable] 
public var open:Object = new Object(); 

private function dropItemInTree():void{ 
    open = myTree.openItems; 
    //A bunch of code that updates the DP 
    reopenTree(); 
} 

public function reopenTree():void{ 
    for each(var item:XML in open){ 
     expandParents(item[0]); 
    } 
} 

private function expandParents(node:XML):void { 
    myTree.expandItem(node,true,false); 
} 

但即使这样也会让我的树最小化。出了什么问题?

+0

XMLTree1.expandItem(MailBox.getItemAt(0),真,假,真); 它的第四个参数。设置它,你的代码应该工作。有关更多详情,请参阅下面的答案。 – 2010-02-09 19:02:41

+0

第四个参数仅用于在expandItem方法运行时调度itemOpen事件。在这种情况下,我甚至无法使用expandItem方法打开一个项目,因此将事件触发并链接到该事件也不起作用。 – invertedSpear 2010-02-09 20:27:34

回答

3

所以,我终于想通了什么事。在我的下拉功能中,我基本上重建了整个DP。尽管它几乎相同,但在Flash播放器中会有不同的UID,因此打开的var中的对象不再引用DP中的对象。幸运的是,我的XML数据提供者中有一个ID字段,因此我可以在重建的DP中查找对象,最后让expandItem方法在那里工作。

所以,我再开功能现在看起来有点像这样:

public function renderTree():void 
    for each(var item:XML in open){ 
     myTree.expandItem(XML(MyDP..node.(@attr == [email protected])),true); 
     //forcing the type to be XML is VITAL 
    } 
} 
1

对不起,这里是完整的解释:底部的链接给出了完整的解释以及完整的示例。

您必须使用树控件的creationComplete事件,而不是初始化事件,因为数据提供程序没有完全初始化并且在creationComplete事件之前可用。

<mx:Tree id="tree1" ... creationComplete="initTree();" > 

OR

你也可以得到openItems盒通过设置expandItem()方法来分派itemOpen事件指示初始开放项目。您可以通过将expandItem()方法的第四个可选参数指定为true来完成此操作。当项目打开时,真正的第四个参数将导致树分派一个打开的事件。下面的例子说明了如何使用第四个参数:

XMLTree1.expandItem(MailBox.getItemAt(0), true, false, true); 

默认情况下,当它初始化树控件折叠,但你可以初始化它,使它与选择的特定节点扩展。

<mx:Script> 
    <![CDATA[ 
     import flash.events.*; 
     import mx.events.*; 
     import mx.controls.*; 
     private function initTree():void { 

      XMLTree1.expandItem(MailBox.getItemAt(0), true); 
      XMLTree1.selectedIndex = 2; 
     } 
    ]]> 
</mx:Script> 

的树控制的基准是:http://livedocs.adobe.com/flex/3/html/help.html?content=dpcontrols_8.html

+0

我的代码应该展开树,就像那个例子一样。我使用了相同的expandItem方法,但是对于我的树来说它不起作用,我不知道为什么。 – invertedSpear 2010-02-09 18:12:33

+0

我在这个例子中遇到的问题是我的树已经被创建,所以我不需要担心创建完成或其他任何事情。 expandItem方法应该可以工作,但它不是(它在我编写的用于打开选定节点的双击函数中工作)。为什么当我循环打开数组时,它不工作? – invertedSpear 2010-02-09 20:24:59

+0

即使我的问题比这个例子显示的更抽象一点,我给你一个加票,因为任何有类似于我的问题的人都需要首先理解这个例子。 – invertedSpear 2010-02-15 15:44:12