0

我正在尝试根据我拥有的这个可绑定数组集合中是否存在特定字符串来使 CheckBox 元素可见,但它似乎不起作用。如果有人能指出我做错了什么,我将不胜感激。

在我的动作脚本代码中,我有

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

在我的弹性代码中,我有

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

1 回答 1

5

问题是contains()方法ArrayCollection不是[Bindable]。在 MXML 花括号表达式中,属性链中的所有内容都必须是 [Bindable]。

通常,当花括号表达式中的属性之一不是 [Bindable] 时,Flex 编译器会警告您。当其中一个属性是函数时,不会生成警告,按照我的设计,我认为它可能是一个有用的快捷方式。

函数可以标记为[Bindable]。只要在定义函数的类中的某个位置,就会调度“绑定”事件。查看源代码ListCollectionView——这是实际定义contains()方法的类。

您会看到该contains()方法未标记为 [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')} />

不同之处在于,当您未在 [Bindable] 元数据中指定事件名称时,Flex 使用默认的“propertyChanged”事件。

在您的场景中,没有任何事情调度“propertyChange”事件来触发绑定(b/c 属性实际上没有改变)。此外,集合调度的“collectionChange”事件未被使用,因为该contains()方法未标记为 [Bindable]。

于 2012-10-03T19:58:03.787 回答