无法绑定到自定义组件的属性

时间:2010-02-25 23:44:19

标签: flex actionscript-3 binding components

似乎无法绑定自定义组件中的数据。我已经尝试了BindUtilis和{},但似乎无法理解它。这就是我所拥有的:

我有一个可以绑定的类DataModel

在Mainn.mxml中我有两个组件:DataGrid(用于测试)& CustomComponent(扩展Canvas)

当DataModel.somelist中的数据更新时,DataGrid会反映更改,但CustomComponent不会显示。

每当更改this._dataModel.itemList时,我都希望看到跟踪(CustomComponent.dataProvider)。我究竟做错了什么?

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);         
    }
}
}

1 个答案:

答案 0 :(得分:0)

您是在自定义组件中重置dataProvider,还是更新意味着从dataModel.itemList添加/删除项目?

如果您要将项目添加到dataModel.itemList,那么您的自定义组件将不会更新,但DataGrid会更新。这是因为在DataGrid中(可能是在Flex的核心ListBase组件中?),当你set dataProvider时,它会为CollectionEvent.COLLECTION_CHANGE添加一个事件监听器。当它听到(当您的ArrayCollection / IList中的某些内容从remove / add / refresh / etc更改时),它会运行一些方法来更新DataGrid的itemRenderers。如果您创建自己的dataProvider属性,则必须手动编码。

如果在自定义组件(custom.dataProvider = myArrayCollection)上显式设置dataProvider,它将更新。但这不是最有效的事情。我建议扩展一个已经实现了dataProvider属性的List类,这需要解决很多问题。

查看source for the mx ListBase's dataProvider method,看看他们做了什么。

希望有所帮助, 兰斯