我的数据网格显示陈旧数据,而不是其数据提供者(数组集合)中可用的实时数据。我尝试重新编辑集合中的数据,但这没有任何效果。以下是我的代码,有谁看到可能是什么问题?
<mx:Accordion/>
<fx:Script>
<![CDATA[
private var _gridData:ArrayCollecton = new ArrayCollection;
[Bindable] public function get gridData():ArrayCollection { return _gridData; }
public function set gridData(value:ArrayCollection):void { _gridData = value; }
public function loadGridData():void {
// imgCollection is the data returned from the server
var tempCollection:ArrayCollection = new ArrayCollection();
for (var i:int = 0; i < imgCollection.length; i++)
{
var img:Object = new Object();
img.id = imgCollection.getItemAt(i).imgId;
img.url = "http://..." + imgCollection.getItemAt(i).imgId;
img.caption = (imgCollection.getItemAt(i).imgCaption == null) ? "": imgCollection.getItemAt(i).imgCaption;
img.group = images;
tempCollection.addItem(new ObjectProxy(img));
}
gridData = tempCollection;
<!-- Use http service to get data and save it in grid data array collection, this is run on accordion create completion and whenever data is added or removed from the array collection -->
}
]]>
</fx:Script>
<!-- NOTE: There is a cyclic binding between the data grid and the gridData array collection -->
<fx:Binding source="dg.dataProvider as ArrayCollection" destination="gridData"/>
...
...
<s:NavigatorContent>
<s:Panel>
<mx:DataGrid dataProvider="{gridData}" ...>
...
...
</mx:DataGrid>
</s:Panel>
</s:NavigatorContent>
更新 我尝试了下面提到的建议,但是,他们没有解决问题。数据网格有自定义项目渲染器,这可能是问题吗?
<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
focusEnabled="true">
<mx:Image id="image" source="{data.url}" height="65" maintainAspectRatio="true" scaleContent="true"/>
</s:MXDataGridItemRenderer>
答案 0 :(得分:1)
您不需要“循环”绑定,因为在您的数据网格中,您不会更改集合,而是更改其项目。该系列保持完整。 DataGrid的数据提供者和_gridData指向同一个集合。
答案 1 :(得分:0)
如果我没有误会你也应该在setter上设置[Bindable],因为datagrid没有其他方式知道你的数据何时发生了变化。
问候,Alin
答案 2 :(得分:0)
在我看来,你正在思考这个问题。由于你没有在你的getter / setter中做任何事情你可以摆脱它们只是将你的ArrayCollection标记为Bindable,然后将它设置为DataGrid的dataProvider并完成:
<fx:Script>
<![CDATA[
[Bindable]
public var gridData:ArrayCollecton = new ArrayCollection;
public function loadGridData():void {
// Whenever you change the gridData, the DataGrid will update appropriately.
}
]]>
</fx:Script>
<mx:DataGrid dataProvider="{gridData}"></mx:DataGrid>
您现有代码的问题可能是您没有在setter中调度更改事件。摆脱getter / setter允许ArrayCollection为您处理调度该事件。希望有所帮助。
编辑:根据更新的问题,您可能想尝试将渲染器更改为这样,如果您的自定义数据对象不可绑定,这将有所帮助。
<?xml version="1.0" encoding="utf-8"?>
<s:MXDataGridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
focusEnabled="true">
<fx:Script>
<![CDATA[
override public function set data(value:Object):void {
super.data = value;
image.source = value.url;
}
]]>
</fx:Script>
<mx:Image id="image" source="{data.url}" height="65" maintainAspectRatio="true" scaleContent="true"/>