Сетка данных не отображает данные в массиве - PullRequest
0 голосов
/ 07 октября 2010

Моя сетка данных отображает устаревшие данные, а не данные в реальном времени, доступные в его поставщике данных (сбор массивов).Я попытался обновить данные в коллекции, но это не имеет никакого эффекта.Ниже мой код, кто-нибудь видит, в чем может быть проблема?

<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>

Ответы [ 3 ]

1 голос
/ 11 октября 2010

Вам не нужно «циклическое» связывание, потому что в вашей таблице данных вы не изменяете коллекцию, а меняете ее элементы.Коллекция остается нетронутой.поставщик данных DataGrid и ваша _gridData указывают на одну и ту же коллекцию.

0 голосов
/ 07 октября 2010

Похоже, ты слишком обдумываешь это.Поскольку вы ничего не делаете в своих методах получения / установки, вы можете избавиться от них и просто пометить вашу коллекцию ArrayCollection как Bindable, затем установить ее как dataProvider для DataGrid, и все будет сделано:

<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>

Проблемас вашим существующим кодом, скорее всего, вы не отправляете событие изменения в свой установщик.Избавление от методов получения / установки позволяет 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"/>

0 голосов
/ 07 октября 2010

Если я не ошибаюсь, у вас также должен быть [Bindable] на сеттере, потому что у сетки данных нет другого способа узнать, когда ваши данные изменились.

С уважением, Алинь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...