2010-02-25 85 views
0

似乎無法綁定到自定義組件內的數據。我試過BindUtilis和{},但似乎無法理解它。下面是我得到了什麼:無法綁定到自定義組件的屬性

我有一個已經取得了可綁定類的DataModel

在Mainn.mxml我有兩個組成部分:數據網格(用於測試)& CustomComponent(延伸帆布)

當DataModel.somelist中的數據更新時,DataGrid反映這些更改,但CustomComponent不顯示。

我期待看到跟蹤(CustomComponent.dataProvider)每當this._dataModel.itemList被改變時觸發。我究竟做錯了什麼?

Main.mxml看起來是這樣的:

<mx:Script> 
<![CDATA[ 
    import model.DataModel; 

    [Bindable] 
    private var _dataModel:DataModel = DataModel.getInstance(); 

]]> 
</mx:Script> 

<mx:VBox width="100%" height="100%"> 
    <views:ItemDisplayList width="100%" height="300" id="idl" > 
     <views:dataProvider> 
      {this._dataModel.itemList} 
     </views:dataProvider> 
    </views:ItemDisplayList> 

    <mx:DataGrid id="dg" width="100%" height="300" > 
     <mx:dataProvider> 
      {this._dataModel.itemList} 
     </mx:dataProvider> 
    </mx:DataGrid> 
</mx:VBox> 

的CustomComponent有這個AS類:

package code{ 

import model.DataModel; 
import mx.containers.Canvas; 

public class CustomComponent extends Canvas{ 

    [Bindable] 
    private var _dataModel:DataModel = DataModel.getInstance(); 

    private var _dataProvider:ArrayCollection ; 

    public function CustomComponent(){ 
     super(); 
     _dataProvider = new ArrayCollection(); 
     trace("CustomComponent start"); 
    } 

    public function get dataProvider() : ArrayCollection { 
     trace("get dataProvider"); 
     return _dataProvider; 
    } 

    public function set dataProvider(value: ArrayCollection) : void { 
     trace("set dataProvider"); 
     this._dataProvider = value; 
     invalidateProperties(); 
     invalidateSize(); 
     invalidateDisplayList(); 
     dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); 
    } 

    ... 


    override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void{ 
     trace("updateDisplayList");  
     super.updateDisplayList(unscaledWidth, unscaledHeight);   
    } 
} 
} 

回答

0

你在你的自定義組件重置數據提供程序,或者通過更新你的意思添加/從dataModel.itemList中刪除一個項目?

如果您將項目添加到dataModel.itemList,那麼您的自定義組件將不會更新,但DataGrid將會更新。這是因爲在DataGrid中(也許它在Flex中的核心ListBase組件中),當您使用set dataProvider時,它會爲CollectionEvent.COLLECTION_CHANGE添加事件偵聽器。當它聽到的時候(當ArrayCollection/IList中的某些內容發生變化時,從remove/add/refresh /等),它會運行一些方法來更新DataGrid的itemRenderer。如果您創建自己的dataProvider屬性,則必須手動對其進行編碼。

如果您在自定義組件(custom.dataProvider = myArrayCollection)上顯式設置dataProvider,它將更新。但這不是最有效的事情。我建議擴展其中一個已經實現了dataProvider屬性的List類,這是需要解決的。

查看source for the mx ListBase's dataProvider method看看他們做了什麼。

希望有幫助, 蘭斯

+0

謝謝蘭斯。我有一種感覺,在某個地方添加了一個監聽器,我想我希望使用Bindable或BindUtils,它可能是自動的。無論如何,我會在這裏跟隨你的建議,看看它帶領我。 – Trist 2010-02-26 11:18:47