Flex树自定义树视图

时间:2010-01-23 20:21:01

标签: flex tree

我有一个xml字符串作为远程对象获取,如:

<metadata>  
  <system name="A">  
    <serviceGroup name="SG1">  
      <version id="id1" />  
      <service name="S1"/>  
    </serviceGroup>  
    <serviceGroup name="SG2">  
      <version id="id2" />  
      <serviceGroup name="SG3">  
        <version id="id3" />  
        <service name="S2"/>  
      </serviceGroup>  
    </serviceGroup>  
  </system>  
.
.
.
.
</metadata>

正如xml示例所示,它包含嵌套的服务组。 我必须显示所有服务和服务组。 并忽略其他一切......例如。版本 服务即。 S1和S2应该是叶节点,其他一切都必须是父节点

E.g。
- &gt;一种
---&GT; SG1
------&GT; S1
----&GT; SG2
------&GT; SG3
---------&GT; S2


我尝试了所有类似的东西,比如使用labelFunctions,labelField属性和Tree,但它没有帮助。我总是最终得到未标记的树叶。

我想我可以用ITreeDataDescriptor做到这一点,但不知道如何做。 我是一名初学者,而adobe sample并没有太多帮助。

我认为上面的教程对初学者来说太复杂了。 如果有人能指出我更简单的事情,我真的很感激。

谢谢, 和Sandeep

2 个答案:

答案 0 :(得分:0)

我认为你的方法可能会让你退缩一点。是否更容易更改控件的默认行为或更改您为该控件提供的数据?

我认为你应该首先将树的数据提取器更改为XMLList metadata.system.serviceGroup(你可能已经这样做了,如果没有你已经尝试过的代码示例,我无法分辨)。然后,您应该遍历该列表并删除版本节点。

delete yourXMLList.serviceGroup.version[0];

您可以搜索谷歌以获得更好的代码示例。

答案 1 :(得分:0)

您需要覆盖ITreeDataDescriptor的getChildren函数。在那里,您可以过滤哪个XML节点应该可见:

package  {
import mx.collections.ICollectionView;
import mx.collections.XMLListCollection;
import mx.controls.treeClasses.ITreeDataDescriptor;

public class CustomDataDescriptor extends ITreeDataDescriptor
{
    public function getChildren(node:Object, model:Object = null):ICollectionView
    {
        var list:XMLList = XMLList(node.*);
        var listColl:XMLList = new XMLList(); 

        var listLenght:int = list.length()

        var j:Number = 0; 
        // gether items which should be visible 
        for (var i:int = 0; i < listLenght; i++)
        {

            if (list[i].localName() != "version")
            {
                listColl[j] = list[i];
                j++
            }                
        }

        return new XMLListCollection(listColl);
    }

    public function hasChildren(node:Object, model:Object = null):Boolean
    {            
        return isBranch(node, model);       
    }

    public function isBranch(node:Object, model:Object = null):Boolean
    {            
        var list:XMLList = XMLList(node.Group);

        return list.length() > 0;
    }

    public function getData(node:Object, model:Object = null):Object
    {
        return Object(node);
    }

    public function addChildAt(parent:Object, newChild:Object, index:int, model:Object = null):Boolean
    {
        return false;
    }

    public function removeChildAt(parent:Object, child:Object, index:int, model:Object = null):Boolean
    {
        return false;   
    }
}

}

并将新的dataDiscriptor分配给树:

<mx:Tree id="customTree" dataDescriptor="{new DisplayGroupsTreeDataDescriptor()}"/>