2011-01-10 46 views
3

我采取某种ComboBox控件(通过扩展spark.components.supportClasses.DropDownListBase)现在AS3:如何知道,如果数据提供程序或内容(S)为改变

,此控件;我需要知道:

  1. 如果数据提供者被更改/分配。 (我可以做...下面的第一种方法);
  2. if dataprovider集合中的任何项目已更改。

我试过2种方法是没有这样的伎俩......

1ST做法:

 [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做法:

由于这是基于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集合中更新任何项目。第二种方法根本不起作用。

回答

1

如果您向我们展示可运行示例以展示问题,我们将能够提供更多帮助。

  1. 如果dataProvider是 改变/分配。

您的第一种方法应该可行。你能告诉我们是什么让你觉得它没有? (我假设没有跟踪陈述?)。并告诉我们你做了什么来改变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的上下文中:当您滚动或打开并关闭下拉列表时,应更新itemRenderer以反映最新的dataProvider数据。但是,如果在下拉打开时更改某些内容,我不会期望它会自动更新[如果您不更改dataProvider。

+0

myClassInstance.dataprovider = someArrCollection; //这工作..但myClassInstance.dataprovider [0] .name =“john”; //不会触发collectionChange事件。有没有办法知道收藏品的属性何时发生变化?所以我可以更新我的组合列表标签.. – 2011-01-10 22:22:55

相关问题