2011-01-10 50 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

相關問題