似乎无法绑定自定义组件中的数据。我已经尝试了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);
}
}
}
答案 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,看看他们做了什么。
希望有所帮助, 兰斯