Flex 4:将ArrayCollection作为数据提供者传递给List的ItemRenderer

时间:2011-05-04 16:18:38

标签: flex itemrenderer skin arraycollection

目标:我想将Skins传递给List的itemRenderer(这是一个Button),并且能够为该List中的每个按钮设置外观。

这就是我所拥有的:

列表:

<s:List itemRenderer="renderers.ItemRenderer" dataProvider="{collectionWorkspace}" />

的ArrayCollection:

<s:ArrayCollection id="collectionWorkspace">
    <comp:Layout1 />
    <comp:Layout2 />
    <comp:Layout3 />
    <comp:Layout4 />
    <comp:Layout5 />
</s:ArrayCollection>

布局是带有HostComponent Button的外观类。

的ItemRenderer:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:mx="library://ns.adobe.com/flex/halo"
                xmlns:s="library://ns.adobe.com/flex/spark">

    <s:states>
        <s:State name="normal" />
    </s:states>

    <s:Button skinClass="{data}"/>

</s:ItemRenderer>

我收到错误(已修复澄清): 错误:应用程序外观....无法找到Button1。

1 个答案:

答案 0 :(得分:2)

您正在将skinClass属性传递给外观类的实例,而不是实际的类(按钮需要创建自己的外观类实例)。

如果可以,最好的办法是让collectionWorkspace成为Class对象的数组,而不是实例。

<s:ArrayCollection id="collectionWorkspace">
    <fx:Class>yourPkg.Layout1</fx:Class>
    <fx:Class>yourPkg.Layout2</fx:Class>
    <fx:Class>yourPkg.Layout3</fx:Class>
    <fx:Class>yourPkg.Layout4</fx:Class>
    <fx:Class>yourPkg.Layout5</fx:Class>
</s:ArrayCollection>

如果你不能这样做,你应该能够拉出实例的类并将其传递给skinClass

<s:Button skinClass="{Object(data).constructor}"/>

修改

默认情况下,绑定不起作用,因为data在使用类初始化之前以null开始。如果你给它null,你将获得例外。要解决此问题,您需要返回null和值之间的默认值:

<s:Button skinClass="{data != null ? data as Class : spark.skins.spark.ButtonSkin}"/>

我尝试使用一些按钮外观使用ArrayCollection执行此操作。它奏效了。