2010-10-29 4 views
2

У меня есть datagrid, который содержит раскрывающийся список Spark, который должен получать динамические данные. В datagrid используется отдельный dataProvider.Dynamic Spark DropDownList ItemRenderer в Flex Datagrid

Когда я использую статический массив ArrayCollection внутри своего ItemRenderer, он работает (см. Список 1).

Однако, когда я использую Swiz для оповещения о событии «list complete» для загрузки ArrayCollection, выпадающий список не отображает новые данные (см. Список 2).

Используя отладчик, я проверил раскрывающийся список ItemRenderer и подтвердил, что новые данные загружаются в ArrayCollection. Новые данные не отображаются в элементе управления пользовательского интерфейса. Я попробовал invalidateProperties() + validateNow() и диспетчеризацию событий как для элемента управления, так и для рендеринга (это), но ничего не кажется, что новые данные появляются в элементе управления на datagrid.

Пожалуйста, помогите !!!

Листинг 1: Datagrid и статические ArrayCollection (это работает):

<mx:DataGrid x="10" y="25" width="98%" id="dgInventory" paddingLeft="25" paddingRight="25" paddingTop="25" paddingBottom="25" 
        editable="true" 
        itemClick="dgInventory_itemClickHandler(event)" dataProvider="{acInventory}" 
        creationComplete="dgInventory_creationCompleteHandler(event)" 
        height="580"> 
      <mx:columns> 
       <mx:DataGridColumn headerText="Item" dataField="itemName" itemRenderer="components.ItemRendererItem" 
            rendererIsEditor="true" editorDataField="selection" editable="true"/> 
       <mx:DataGridColumn headerText="Quantity Required" dataField="quantityReq" itemRenderer="components.ItemRendererQuantityRequired" 
            rendererIsEditor="true" editorDataField="selection" editable="true"/> 
      </mx:columns> 
</mx:DataGrid> 

<fx:Script> 
    <![CDATA[  

     import mx.collections.ArrayCollection; 
     import spark.events.IndexChangeEvent; 

     public var selection:int; 

     [Bindable] 
     protected var acItem:ArrayCollection = new ArrayCollection(
      [ { itemName: "Item1"}, 
       { itemName: "Item2"}, 
       { itemName: "Item3"}, 
      ]); 
    // 
     protected function dropdownlist1_changeHandler(e:IndexChangeEvent):void 
     { 
      selection = e.newIndex; 
     } 

    ]]> 
</fx:Script> 

<s:DropDownList id="ddlItem" prompt="Select Item" dataProvider="{acItem}" labelField="itemName" 
       selectedIndex="{int(dataGridListData.label)}" 
       change="dropdownlist1_changeHandler(event)" 
       width="80%" top="5" bottom="5" left="5" right="5"/> 

Листинг 2: Динамический 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[  
      import event.ItemEvent; 

      import mx.collections.ArrayCollection; 
      import mx.events.FlexEvent; 

      import spark.events.IndexChangeEvent; 

      public var selection:int; 
     // 
      [Bindable] 
      protected var acItem:ArrayCollection = new ArrayCollection(); 
     // 
      protected function dropdownlist1_changeHandler(e:IndexChangeEvent):void 
      { 
       selection = e.newIndex; 
      } 
     // 
      protected function ddlItem_creationCompleteHandler(event:FlexEvent):void 
      { 
       var eve : ItemEvent = new ItemEvent(ItemEvent.LIST_ITEM_REQUESTED); 
       dispatchEvent(eve); 
      } 
     // 
      [Mediate(event="ItemEvent.LIST_ITEM_COMPLETE", properties="acItem")] 
      public function refreshness(_acItem : ArrayCollection):void 
      { 
       acItem.removeAll(); 

       var len:int = _acItem.length; 

       if (len > 0) 
       { 
        for (var i:int=0; i < len; i++) 
        { 
         var newItem:Object = new Object; 
         newItem["itemName"] = _acItem[i].itemName; 
         acItem.addItem(newItem); 
        } 
       } 
       this.invalidateProperties(); 
       this.validateNow(); 
       //dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE)); 
      } 

     ]]> 
    </fx:Script> 

    <s:DropDownList id="ddlItem" prompt="Select Item" dataProvider="{acItem}" labelField="itemName" 
        selectedIndex="{int(dataGridListData.label)}" 
        creationComplete="ddlItem_creationCompleteHandler(event)" 
        change="dropdownlist1_changeHandler(event)" 
        width="80%" top="5" bottom="5" left="5" right="5"/> 
</s:MXDataGridItemRenderer> 

ответ

2

После повторного чтения серии ItemRenderer от Peter Ent это оказалось довольно простым.

Я продлил DataGrid иметь свойство ArrayCollection мне нужно, а затем добавил это к моему визуализатора:

[Bindable] 
      protected var acItem:ArrayCollection = new ArrayCollection(); 
     // 
      override public function set data(value:Object) : void 
      { 
       super.data = value; 
       acItem = (listData.owner as MyDataGrid).itemList; // get the data from the renderer's container (by extending it to add a property, if necessary) 
      } 
Смежные вопросы