Flex自定义TreeItemRenderer根据对象类型更改?

时间:2011-10-07 20:57:32

标签: actionscript-3 flex user-interface flex4 tree

我有一个Flex树控件,它包含一个充满各种类型对象的树。我想根据这种类型(以及其他属性)更改项目的标签。我更喜欢在自定义TreeItemRenderer中执行此操作,而不是通过标签或labelfunction。

似乎无论我做什么,我都不能进行类型检查或转换对象,因此我在树的节点中得到[Object object]。这是我的渲染器:

public class MyCustomTreeItemRenderer extends TreeItemRenderer {
    // Overriding to set the text for each tree node.      
    override protected function updateDisplayList(unscaledWidth:Number, 
                                                  unscaledHeight:Number):void {

        super.updateDisplayList(unscaledWidth, unscaledHeight);

        if (super.data) {
            trace("Rendering node:");

            if (super.data is MyClassA) { 
                trace("             MyClassA");
                super.label.text =  MyClassA(super.data).name
            }

            if (super.data is MyClassB) { 
                trace("             MyClassB");
                super.label.text = MyClassB(super.data).id;
            }
        }
    }

    public function NavigateTreeItemRenderer() {
        super();
    }

}

检查跟踪显示我正在渲染节点,但我从未在两个if语句中找到任何一个。当我在调试器中运行时,我实际上可以在“数据”上与MyClassA和MyClassB对应的属性!

2 个答案:

答案 0 :(得分:1)

  1. 根据您的条件,您可以使用其他方式:

    覆盖公共函数集数据(value:Object){      super.data = value;      label.text = ... }

  2. 但很简单的是写labelFunction

答案 1 :(得分:0)

事实证明,我被一个微妙的问题所困扰,即ActionScript3编译器会自动从远程服务SWC中删除我的类,因为它没有检测到对这些类的任何直接引用。因为这些对象由RemoteObject结果处理程序实例化并放入子ArrayCollection中,所以编译器无法检测到它们。

当发生这种情况时,Flex的RemoteObject实现不是抛出异常而是简单地(并且安静地)将它们水合成一个通用对象,从而否定了它们强类型接口的价值。

解决方法是在每个派生服务类中为每个可能出现在其对象图中的值对象声明一个变量。