flex4 mx|Tree - 当我折叠和展开一个项目时项目顺序发生变化 [英] flex4 mx|Tree - items order change when i fold and unfold an item

查看:22
本文介绍了flex4 mx|Tree - 当我折叠和展开一个项目时项目顺序发生变化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 Flex 4.1,我尝试使用自定义 ItemRenderer (MXTreeItemRenderer) 创建一个 Tree 元素.我的问题是,每当我折叠和展开根项目时,项目的顺序都会发生变化.这很奇怪,因为 XML 的格式可能不正确.

Using Flex 4.1, i'm trying to create a Tree element with a custom ItemRenderer (MXTreeItemRenderer). my problem is that whenever I fold and unfold a root item, the order of the items change.. it's weird like maybe the XML is not formatted properly.

有什么想法吗?

我的 Main.mxml 文件:

my Main.mxml file:

<?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>

推荐答案

感谢 David Goshadze 的评论,我能够解决问题.

thanks to David Goshadze's comment i was able to resolve the issue.

这是我的新 XML:

<notifications>
 <root label="a">
  <item label="moshe"/>
  <item label="moshe2"/>
 </root>
 <root label="b" />
 <root label="c" />
 <root label="d" />
<root label="e" />
</notifications>

这是我的新渲染器:

<?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"/>
    <s:State name="hovered"/>
    <s:State name="selected"/>
</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 (super.data) {
            if(treeListData.hasChildren)
            {

                setStyle("color", 0xff0000);
                setStyle("fontWeight", 'bold');
            }
            else
            {
                setStyle("color", 0x000000);
                setStyle("fontWeight", 'normal');
            }  

        } 
    }


override protected function createChildren():void

{

super.createChildren();



}       
// 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)
        {
            var val:XML = super.data as XML;
             if (val.name() == 'root') {
                this.rootItemGroup.visible=true;
                this.itemGroup.visible=false;
                var tmp:XMLList = 
                    new XMLList(treeListData.item);
                var myStr:int = tmp[0].children().length();
                this.labelField.text= super.data.@label + " (" + myStr.toString() + ")";
            } else {
                this.rootItemGroup.visible=false;
                this.itemGroup.visible=true;
            }
        }

    }


    ]]>
</fx:Script>

<s:HGroup id="rootItemGroup" visible="false" left="0" right="0" top="0" bottom="0" verticalAlign="middle">
    <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 id="itemGroup" visible="false">
    <s:Label text="item ->"/>
    <s:Label text="{treeListData.label}"/>
 </s:HGroup>


</s:MXTreeItemRenderer>

如果我想检查一个项目是叶子还是节点,我无法检查 .hasChildren,因为我有带节点的叶子.所以我检查了 XML 对象的 name 属性来弄清楚.效果很好!感谢您的帮助.

If i want to check if an item is a leaf or a node I cannot check .hasChildren because i have leafs with nodes. so i check the name attribute of the XML object to figure that out. works great! thanks for the assistance.

这篇关于flex4 mx|Tree - 当我折叠和展开一个项目时项目顺序发生变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆