2010-10-29 60 views
2

我有一個datagrid,其中包含需要獲取動態數據的Spark下拉列表。 datagrid使用一個單獨的dataProvider。Dynamic DataGrid中的動態Spark DropDownList ItemRenderer

當我在我的ItemRenderer中使用靜態ArrayCollection時,它可以工作(請參見清單1)。但是,當我使用Swiz調解'list complete'事件來加載ArrayCollection時,下拉列表不顯示新數據(請參見清單2)。

使用調試器,我檢查了下拉列表ItemRenderer並確認新數據正在加載到ArrayCollection中。新的數據未顯示在UI控件中。我已經嘗試invalidateProperties()+ validateNow()並在控件和渲染器(this)上調度事件,但似乎沒有任何東西使新數據出現在數據網格的控件中。

請幫忙!!!

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

在重新閱讀Peter Ent的ItemRenderer系列後,結果很簡單。

我擴展的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) 
      }