ItemRender数据更改

时间:2011-05-09 14:48:30

标签: flex actionscript-3 itemrenderer

我有一个带有ItemRenderer的List。当我单击一个按钮时,我更改了绑定到列表的ArrayCollection的属性。

当我单击按钮时,它确实会更改属性,但列表不会更改。

我该如何解决这个问题。

这是我的代码

<fx:Script>
    <![CDATA[

        [Bindable] 
        public var controllers:ControllerCollection = new ControllerCollection();

        private function hideTheFirstItem(evt:MouseEvent):void
        {
            (controllers[0] as Controller).meetsRequirements = false;

                    //these methods don't work unfortunatly
                    controllers.itemUpdated(controllers[0]);
                    controllers.refresh();

        }


    ]]>
</fx:Script>

<mx:List id="listControllers" dataProvider="{controllers}">
    <mx:itemRenderer>
        <fx:Component>
            <solutionItems:displaySolutionItem visible="{data.meetsRequirements}" />
        </fx:Component>
    </mx:itemRenderer>
</mx:List>
<mx:Button label="test" click="hideTheFirstItem(event)" />

(ControllerCollection扩展ArrayCollection)

谢谢!

文森特

4 个答案:

答案 0 :(得分:2)

两种方式:

  1. collection.refresh()
  2. collection.itemUpdated()
  3. 当然,ControllerCollection不是标准的Flex Collection类;所以我只是假设它实现了ICollectionView接口。


    更新: 我注意到你的代码被设置为修改ArrayCollection的第一个元素

    private function hideTheFirstItem(evt:MouseEvent):void
    {
     (controllers[0] as Controller).meetsRequirements = false;
    
     //these methods don't work unfortunatly
     controllers.itemUpdated(controllers[0]);
     controllers.refresh();
    }
    

    我想确保指定集合的​​第一个元素可能不是视图中当前可见的第一个元素。我想知道这是否会引起你的问题。

答案 1 :(得分:2)

如果没有看到你的项目渲染器,我需要做一些假设。

首先,我假设您的项呈示器正在使用绑定到meetsRequirements属性的数据。如果是这种情况,则meetsRequirements属性需要在该属性更改时通知。如果您将[Bindable]标记添加到该属性或Controller类,则meetsRequirements属性将通知itemRenderer根据您的数据绑定更新该字段。

如果我的假设是错误的,我们需要查看代码,以便进一步提出想法。

答案 2 :(得分:1)

试试这个:

<fx:Script>
    <![CDATA[

        [Bindable(Event="refreshMyList")] 
        public var controllers:ControllerCollection = new ControllerCollection();

        private function hideTheFirstItem(evt:MouseEvent):void
        {
            (controllers[0] as Controller).meetsRequirements = false;

            dispatchEvent(new Event("refreshMyList"));
        }


    ]]>
</fx:Script>

答案 3 :(得分:1)

首先,如果您不需要,请不要尝试创建新的集合。

我相信你的问题在于这句话:(controllers[0] as Controller).meetsRequirements = false;在编译时失败,因为无法使用方括号注释检索集合项。您需要使用getItemAt(index:int)函数。

此外,如果您想要“删除”它,您不希望将可见设置为false设置为项呈示器,因为那时您将有一个空白点。你想要做的就是过滤掉它:

<s:Application creationComplete="onCreationComplete()">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;

            [Bindable] public var data:ArrayCollection = new ArrayCollection();

            private function onCreationComplete():void
            {
                // TODO: need to add data here
                // Adding filter function
                data.filterFunction = filterItems;
            }

            private function filterItems(item:Object):Boolean
            {
                return item.meetsRequirements;
            }

            private function hideFirstItem():void
            {
                if(data.length > 0)
                {
                    Controller(data.getItemAt(0)).meetsRequirements = false;
                }

                data.refresh();
            }
        ]]>
    </fx:Script>

    <mx:List id="listControllers" dataProvider="{data}" />
    <mx:Button label="test" click="hideFirstItem()" />
</s:Application>

这应该这样做。虽然未经测试。