绑定到数组集合的数据不起作用

ima*_*453 0 apache-flex actionscript-3

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

在我的动作代码中,我有

[Bindable]private var dataTypesUsed:ArrayCollection = new ArrayCollection();
Run Code Online (Sandbox Code Playgroud)

在我的弹性代码中,我有

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

Sun*_* D. 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')} />
Run Code Online (Sandbox Code Playgroud)

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

在您的方案中,没有任何事情调度"propertyChange"事件来触发绑定(b/c属性字面上没有改变).此外,该集合调度的"collectionChange"事件未被使用b/c该contains()方法未标记为[Bindable].