我有一个树形控件,在我放入一个项目(更新数据提供者)后,我希望它保持打开状态。我已经尝试了很多东西,包括this question的例子,我无法开始工作,所以我做的事情让我觉得更基本。像这样:
[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 :(得分:3)
所以我终于弄清楚发生了什么。在我的drop函数中,我基本上重建了整个DP。虽然它几乎相同,但它在Flash播放器中会有不同的UID,因此open var中的对象不再引用DP中的对象。幸运的是我的XML数据提供者中有一个ID字段,所以使用它我可以在重建的DP中查找对象,最后让expandItem方法在那里工作。
所以我的重新打开功能现在看起来像这样:
public function renderTree():void
for each(var item:XML in open){
myTree.expandItem(XML(MyDP..node.(@attr == item.@attr)),true);
//forcing the type to be XML is VITAL
}
}
答案 1 :(得分:1)
对不起,这里有完整的解释:底部的链接提供完整的说明以及完整的样本。
您必须使用Tree控件的creationComplete事件,而不是initialize事件,因为数据提供程序在creationComplete事件之前未完全初始化并可用。
<mx:Tree id="tree1" ... creationComplete="initTree();" >
OR
您还可以通过设置expandItem()方法来调度itemOpen事件,从而获取openItems框以指示初始打开的项目。您可以通过将expandItem()方法的第四个可选参数指定为true来执行此操作。真正的第四个参数使树在项目打开时调度打开事件。以下示例显示了第四个参数的使用:
XMLTree1.expandItem(MailBox.getItemAt(0), true, false, true);
默认情况下,Tree控件在初始化时会折叠,但您可以对其进行初始化,以便在选择特定节点的情况下展开它。
<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