【发布时间】:2011-02-27 16:33:02
【问题描述】:
使用 Flex 4.1,我正在尝试使用自定义 ItemRenderer (MXTreeItemRenderer) 创建一个 Tree 元素。我的问题是,每当我折叠和展开一个根项目时,项目的顺序都会改变..这很奇怪,可能 XML 格式不正确。
有什么想法吗?
我的 Main.mxml 文件:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<!-- Launch your application by right clicking within this class and select Debug As > FDT SWF Application -->
<fx:Declarations>
<fx:XML id="moshe">
<notifications>
<root label="a" state="root_item">
<node state="item" label="moshe"/>
<node state="item" label="moshe"/>
</root>
<root label="b" state="root_item"/>
<root label="c" state="root_item"/>
<root label="d" state="root_item"/>
<root label="e" state="root_item"/>
</notifications>
</fx:XML>
</fx:Declarations>
<mx:Tree dataProvider="{moshe}" width="500" itemRenderer="TheRenderer" labelField="@label" showRoot="false" folderClosedIcon="{null}" defaultLeafIcon="{null}"
folderOpenIcon="{null}" />
</s:Application>
和我的项目渲染器:
<?xml version="1.0" encoding="utf-8"?>
<s:MXTreeItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<s:states>
<s:State name="normal" basedOn="{data.@state}"/>
<s:State name="hovered" basedOn="{data.@state}"/>
<s:State name="selected" basedOn="{data.@state}"/>
<s:State name="root_item"/>
<s:State name="item" />
</s:states>
<fx:Script>
<![CDATA[
import com.flexer.Debug;
import mx.controls.Alert;
override public function set data(value:Object):void {
super.data = value;
if(treeListData.hasChildren)
{
setStyle("color", 0xff0000);
setStyle("fontWeight", 'bold');
}
else
{
setStyle("color", 0x000000);
setStyle("fontWeight", 'normal');
}
}
// Override the updateDisplayList() method
// to set the text for each tree node.
override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(super.data)
{
if(treeListData.hasChildren)
{
var tmp:XMLList =
new XMLList(treeListData.item);
var myStr:int = tmp[0].children().length();
this.labelField.text= super.data.@label + " (" + myStr.toString() + ")";
}
}
}
]]>
</fx:Script>
<s:HGroup left="0" right="0" top="0" bottom="0" verticalAlign="middle" includeIn="root_item">
<s:Rect id="indentationSpacer" width="{treeListData.indent}" percentHeight="100" alpha="0">
<s:fill>
<s:SolidColor color="0xFFFFFF" />
</s:fill>
</s:Rect>
<s:Group id="disclosureGroup">
<s:BitmapImage source="{treeListData.disclosureIcon}" visible="{treeListData.hasChildren}" />
</s:Group>
<s:BitmapImage source="{treeListData.icon}" />
<s:Label id="labelField" text="{treeListData.label}" paddingTop="2"/>
</s:HGroup>
<s:HGroup includeIn="item">
<s:Label text="{treeListData.label}"/>
</s:HGroup>
</s:MXTreeItemRenderer>
【问题讨论】:
-
恕我直言,您正在搞乱项目渲染器中的状态。 data.@state 上的数据源绑定将不起作用,因为 XML 不是 Dispatcher。而且我不知道您出于什么原因将 root_item 状态属性添加到项目 b 到 e 顺便说一句,您打算用这个属性实现什么?
-
嗨。我创建了这个小例子来演示我的问题。一般来说,状态会显示它是否是根项目,如果不是,那么我实际上应该从 Flash 导入一个组件。我试图与州一起玩,但我想这不是一个好的选择。将尝试使用不同的方法来实现它。
-
谢谢!!!我的问题解决了。
标签: xml apache-flex flex4 tree