Apache flex 使用itemRenderer更改列表的contentBackgroundColor

Apache flex 使用itemRenderer更改列表的contentBackgroundColor,apache-flex,list,flex4,flash-builder,itemrenderer,Apache Flex,List,Flex4,Flash Builder,Itemrenderer,嘿,这里-我正试图根据在数据提供程序中找到的内容更改列表组件的contentBackgroundColor。例如: <s:ItemRenderer name="ir" xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" autoDrawBackgroun

嘿,这里-我正试图根据在数据提供程序中找到的内容更改列表组件的contentBackgroundColor。例如:

<s:ItemRenderer name="ir"
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    autoDrawBackground="true"
    contentBackgroundColor="{(data.location == 'home')?0x000000:0x666666}">


不幸的是,这似乎被忽略了,因为列表只显示默认的白色背景。有人能提出解决方案吗?

我会覆盖set data setter方法并在那里设置样式,因为您可以保证捕获对数据的每次更改:

override public function set data(value:Object):void {
    super.data = value;
    this.setStyle("contentBackgroundColor", value.location == "home" ? 0x000000 : 0x666666);
}

ItemRenderer从不尊重contentBackgroundColor的组扩展而来,而是将其作为继承样式传递给其元素

所以contentBackgroundColor确实可以工作,但并不像您期望的那样,如果您将一个确实尊重contentBackgroundColor的组件放入渲染器,那么它将获得该颜色,例如:

<s:List>
    <s:dataProvider>
        <s:ArrayList>
            <fx:String>0</fx:String>
        </s:ArrayList>
    </s:dataProvider>
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer contentBackgroundColor="red">
                <s:VGroup paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">
                    <s:Label text="ItemRenderer {data}" />
                    <s:ComboBox />
                </s:VGroup>
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
</s:List>
<s:List>
    <s:dataProvider>
        <s:ArrayList>
            <fx:String>0</fx:String>
            <fx:String>1</fx:String>
        </s:ArrayList>
    </s:dataProvider>
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer>
                <fx:Script>
                    <![CDATA[
                        override public function set data(value:Object):void {
                            super.data = value;
                            if (data == null)
                                return;

                            if (data == 1){
                                c.color = 0xEEEEEE;
                            } else {
                                c.color = 0x666666;   
                            }
                        }
                    ]]>
                </fx:Script>
                <s:Rect width="100%" height="100%">
                    <s:fill>
                        <s:SolidColor id="c" />
                    </s:fill>
                </s:Rect>
                <s:Label text="ItemRenderer {data}" />
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
</s:List>

0
正如前面指出的,您最好覆盖数据设置器并从中更改背景矩形的颜色,例如:

<s:List>
    <s:dataProvider>
        <s:ArrayList>
            <fx:String>0</fx:String>
        </s:ArrayList>
    </s:dataProvider>
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer contentBackgroundColor="red">
                <s:VGroup paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10">
                    <s:Label text="ItemRenderer {data}" />
                    <s:ComboBox />
                </s:VGroup>
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
</s:List>
<s:List>
    <s:dataProvider>
        <s:ArrayList>
            <fx:String>0</fx:String>
            <fx:String>1</fx:String>
        </s:ArrayList>
    </s:dataProvider>
    <s:itemRenderer>
        <fx:Component>
            <s:ItemRenderer>
                <fx:Script>
                    <![CDATA[
                        override public function set data(value:Object):void {
                            super.data = value;
                            if (data == null)
                                return;

                            if (data == 1){
                                c.color = 0xEEEEEE;
                            } else {
                                c.color = 0x666666;   
                            }
                        }
                    ]]>
                </fx:Script>
                <s:Rect width="100%" height="100%">
                    <s:fill>
                        <s:SolidColor id="c" />
                    </s:fill>
                </s:Rect>
                <s:Label text="ItemRenderer {data}" />
            </s:ItemRenderer>
        </fx:Component>
    </s:itemRenderer>
</s:List>

0
1.

呼叫正常,但仍被忽略。如果我在itemrenderer集合数据方法中跟踪(value.location),它跟踪的次数会比我在xml中有location元素的次数多。实际上是+1的两倍。非常奇怪的行为…嗯,如果将AutoDruckGround设置为false会发生什么?另外,另一种方法是将其设置为false,并在项目渲染器的背景中添加一个Rect,然后根据需要设置填充颜色。如果AutoDruckGround=false,则背景保持白色,但项目高亮显示现在处于关闭状态。我将尝试Rect解决方案,在adobe帮助页面上也看到了这一点。添加不起作用。您需要为其提供维度。宽度/高度100%或左、右、上、下=0。如果itemRenderer是外部的,并且在一个水平布局中有多个标签,该怎么办。例如:
这很难解释。如果我将上面的代码应用于我的外部itemRenderer,它会在第一个标签开始之前渲染一个彩色框。如果If条件中的条件为true,则会将该彩色框渲染为特定颜色。然而,当我滚动我的列表时,它的行为很奇怪,并且以一种随机的方式呈现其他颜色的框。我希望这是有道理的。