的问题是,ArrayCollection
的方法不是[绑定]。在MXML大括号表达式中,属性链中的所有内容都必须是[Bindable]。
通常,Flex编译器会在大括号表达式中的某个属性不是[Bindable]时发出警告。当其中一个属性是一个函数时,不会生成警告,按照我的设计,因为它可能是一个有用的快捷方式。
函数可以标记为[Bindable]。只要在定义函数的类的某个地方调度了“绑定”事件。看看ListCollectionView
的源代码 - 这是实际定义方法的类。
您会看到方法未标记为[Bindable],而对比方法是getItemAt()
。
你可以用几种不同的方法解决你的问题。这里有一个调度自定义绑定事件:
[Bindable("dataTypesUsedChanged")]
private var dataTypesUsed:ArrayCollection = new ArrayCollection();
private function someMethodThatUpdatesTheCollection():void
{
dataTypesUsed.addItem("foo");
// addItem will make the collection dispatch CollectionEvent.COLLECTION_CHANGE
dispatchEvent(new Event("dataTypesUsedChanged")
}
<s:CheckBox visible={dataTypesUsed.contains('foo')} />
不同的是,当你没有在[绑定]元数据指定事件名称,Flex使用默认的“的PropertyChanged”事件。
在你的场景中,没有任何事情调度“propertyChange”事件来触发绑定(B/C属性字面上没有改变)。此外,集合派发的“collectionChange”事件未被使用,因此方法未标记为[Bindable]。
据我所知,在ArrayCollection上没有'contains()'方法这样的事情。 – RIAstar
有,它是从'ListCollectionView'派生的。 – ndm
@ndm谢谢指出, – RIAstar