2012-10-03 109 views
0

我想根据一个特定的字符串是否存在于这个可绑定的数组集合中,使得CheckBox元素可见,但它似乎不起作用。如果有人能指出我做错了什么,我会很感激。数据绑定到一个数组集合不工作

在我的ActionScript代码,我有

[Bindable]private var dataTypesUsed:ArrayCollection = new ArrayCollection(); 

,并在我的Flex代码,我有

<s:CheckBox selected="true" label="test" id="testBox" visible="{dataTypesUsed.contains('Target')}" includeInLayout="{dataTypesUsed.contains('Target')}"/> 
+1

据我所知,在ArrayCollection上没有'contains()'方法这样的事情。 – RIAstar

+0

有,它是从'ListCollectionView'派生的。 – ndm

+0

@ndm谢谢指出, – RIAstar

回答

5

的问题是,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]。

+0

感谢您的回复。愚蠢的问题,但不是包含方法仍然没有绑定任何事件?那么MXML花括号现在可以工作吗? (或者,包含方法或集合对象必须绑定到实际发生的事件,才能起作用?)。感谢你的宝贵时间! – iman453

+1

正确,contains()方法不绑定任何东西。我上面的例子只绑定到dataTypesUsed变量。我的例子工作的原因是因为它调度事件说事情已经改变(导致大括号表达式被评估)。在您的原始示例中,正在生成事件以触发绑定 –

+0

有道理,谢谢您的回复:) – iman453