2012-10-03 150 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