Actionscript 3 与数组集合的数据绑定无效

Actionscript 3 与数组集合的数据绑定无效,actionscript-3,apache-flex,Actionscript 3,Apache Flex,我试图根据我拥有的这个可绑定数组集合中是否存在特定字符串,使复选框元素可见,但它似乎不起作用。如果有人能指出我做错了什么,我会非常感激 在我的actionscript代码中,我有 [Bindable]private var dataTypesUsed:ArrayCollection = new ArrayCollection(); 在我的flex代码中,我有 <s:CheckBox selected="true" label="test" id="testBox" visible="{d

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

在我的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')}"/>

问题在于
数组集合的
contains()
方法不可[Bindable]。在MXML花括号表达式中,属性链中的所有内容都必须是[可绑定的]

通常,当大括号表达式中的某个属性不可[Bindable]时,Flex编译器会发出警告。我认为,当其中一个属性是函数时,不会生成警告,因为它可能是一个有用的快捷方式

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

您将看到
contains()
方法没有标记为[Bindable],相反,
getItemAt()
方法被标记为[Bindable]

你可以用几种不同的方法来解决你的问题。下面是一个分派自定义绑定事件的程序:

[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(“dataTypesUsedChanged”)]
使用的私有var数据类型:ArrayCollection=new ArrayCollection();
私有函数someMethods更新集合():void
{
数据类型使用添加项(“foo”);
//addItem将更改集合分派CollectionEvent.collection\u
dispatchEvent(新事件(“dataTypesUsedChanged”)
}
不同之处在于,如果不在[Bindable]元数据中指定事件名称,Flex将使用默认的“propertyChanged”事件


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

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

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

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

您将看到
contains()
方法没有标记为[Bindable],相反,
getItemAt()
方法被标记为[Bindable]

您可以通过几种不同的方法解决问题。下面是一种发送自定义绑定事件的方法:

[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(“dataTypesUsedChanged”)]
使用的私有var数据类型:ArrayCollection=new ArrayCollection();
私有函数someMethods更新集合():void
{
数据类型使用添加项(“foo”);
//addItem将更改集合分派CollectionEvent.collection\u
dispatchEvent(新事件(“dataTypesUsedChanged”)
}
不同之处在于,如果不在[Bindable]元数据中指定事件名称,Flex将使用默认的“propertyChanged”事件


在您的场景中,没有任何内容发送“propertyChange”事件来触发绑定(b/c属性实际上没有更改)。此外,未使用由集合发送的“collectionChange”事件b/c
contains()
方法未标记为[Bindable].

据我所知,在
ArrayCollection
上没有
contains()
方法,它是从
ListCollectionView
@ndm派生出来的。感谢你指出,据我所知,没有
contains()这样的东西
ArrayCollection上的
方法
有,它来自
ListCollectionView
@ndm感谢你指出这一点谢谢你的回答。愚蠢的问题,但是contains方法还没有绑定到任何事件吗?那么MXML花括号现在可以工作了吗?(或者contains方法或集合对象是否必须绑定到实际发生的事件才能工作?)。再次感谢您的时间!正确,contains()方法未绑定到任何对象。我上面的示例仅绑定到dataTypesUsed变量。我的示例之所以有效,是因为它调度事件,表示某些内容已更改(导致对大括号表达式求值)。在原始示例中,生成事件以触发绑定感谢您的回答。愚蠢的问题,但是contains方法是否仍然没有绑定到任何事件?那么MXML大括号现在可以工作了吗?(或者contains方法或集合对象必须绑定到实际发生的事件才能工作?)。再次感谢您的时间!正确,contains()方法没有绑定到任何对象。我上面的示例仅绑定到dataTypesUsed变量。我的示例之所以有效,是因为它发送事件,表示某些内容已更改(导致计算大括号表达式)。在原始示例中,生成事件以触发绑定