我正在实施某种组合框控制(通过扩展spark.components.supportClasses.DropDownListBase
)
现在,在这个控件内;我需要知道:
我尝试了两种没有做到这一点的方法......
第一种方式:
[Bindable("collectionChange")]
override public function set dataProvider(value:IList):void
{
if (value) value.addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
super.dataProvider = value;
trace("DATA CHANGED"); //fires
}
protected function onDataChange(event:CollectionEvent):void
{
trace("COLLECTION ITEM(S) CHANGED"); //does not fire
}
2ND APPROACH:
因为这是基于DropDownListBase
;它应该已经发送CollectionEvent.COLLECTION_CHANGE
事件..?
public function myClass() //constructor
{
addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
}
protected function onDataChange(event:CollectionEvent):void
{
trace("DATA CHANGED"); //does not fire
}
有什么想法吗?
更新:上面编辑..第一种方法让我知道数据提供者是否被更改,但是如果在dataprovider集合中更新了任何项目则不知道。第二种方法根本不起作用..
答案 0 :(得分:1)
如果您向我们展示可运行的样本以证明问题,我们将能够提供更多帮助。
- 如果数据提供者是 改变/分配。
醇>
你的第一种方法应该有效。你能告诉我们你认为它没有的原因吗? (我假设没有跟踪声明?)。并告诉我们您为更改dataProvider所做的工作。
第二种方法不起作用,因为myClass没有触发collectionChange事件。
2,如果dataprovider集合中的任何项目已更改。
没有办法告诉这个。在大多数情况下,集合只是指向其他对象的指针列表。如果更改这些指针,则会触发collectionChange事件。如果您更改指针指向的项目,则集合无法知道某些内容已更改。如果您的MXML粉丝,绑定的工作方式非常相似。
如果您可以控制项目的更改方式,则可以通过这种方式处理。而不是:
(collection.getITemAt(x) as myObject).property = newValue;
做这样的事情:
var myObject : MyObject = collection.getITemAt(x) as myObject
myObject.property = newValue;
collection.setItemAt(x, myObject);
我希望能解雇collectionChange事件,而不是前者。
也就是说,在dropDownListBase的上下文中:当您滚动或打开并关闭下拉列表时,应该更新itemRenderers以反映最新的dataProvider数据。但是如果你在下拉打开时动态改变了某些东西,我不希望它自动更新[如果你没有改变dataProvider。