我有一个带有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)
谢谢!
文森特
答案 0 :(得分:2)
两种方式:
当然,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>
这应该这样做。虽然未经测试。