2014-09-23 36 views
0

我似乎遇到了未按预期创建项目的问题,导致事件侦听器未被触发。DataGrid中的项目未按预期初始化

我使用复选框的DataGrid列如下所示:(fwctrl是一个内部库的命名空间)

<mx:DataGrid id="gridComponents" height="100%"> 
    <mx:columns> 
     <fwctrl:DataGridCheckBoxColumn id="colChkBox" width="20" selectionChanged="onGridChbBoxChange(event)" /> 
     <mx:DataGridColumn headerText="Components" dataField="name" width="250"/> 
    </mx:columns> 
</mx:DataGrid> 

这里是什么fwctrl的MXML: DataGridCheckBoxColumn样子:

<mx:DataGridColumn xmlns:mx="http://www.adobe.com/2006/mxml" resizable="false" xmlns:grid="fwctrl.grid.*" xmlns:CheckBoxColumn="fwctrl.grid.CheckBoxColumn.*"> 
<mx:Metadata> 
    [Event(name="selectionChanged", type="fwctrl.grid.CheckBoxColumn.DataColumnCheckBoxEvent")] 
</mx:Metadata> 
<mx:Script> 
    <![CDATA[ 
     ... 

    ]]> 
</mx:Script> 
<mx:headerRenderer> 
    <mx:Component> 
     <CheckBoxColumn:CheckBoxHeaderRenderer textAlign="center" click="checkboxheaderrenderer1_clickHandler(event)"> 

      <mx:Script> 
      ... 
      </mx:Script> 
     </CheckBoxColumn:CheckBoxHeaderRenderer> 
    </mx:Component> 
</mx:headerRenderer> 
<mx:itemRenderer> 
    <mx:Component> 
     <mx:Box horizontalAlign="center" 
       verticalAlign="middle" enabled="{outerDocument.isEnabled}"> 
      <mx:Script> 
       <![CDATA[ 
        ...   


        protected function checkBox_initializeHandler(event:FlexEvent):void 
        { 
         trace("init checkbox"); 
        } 

       ]]> 
      </mx:Script> 
      <mx:CheckBox id="checkBox" click="onCheckBoxClick()" change="onChange(event)" initialize="checkBox_initializeHandler(event)"/> 
     </mx:Box> 
    </mx:Component> 
</mx:itemRenderer> 

CheckBoxHeaderRenderer是一个继承自复选框的类。

使用MXML上述我结合一个ArrayCollection到数据提供通过执行:gridComponents.dataProvider = coll;

具有checkBox_initializeHandler事件的约束,我希望看到印刷于我的集合中的每个元素的消息。

实际上,消息只会显示在“不会脱离网格”的元素上,也就是说,如果有滚动条(由于大量项目正在呈现),那些低于网格的底部(即那些需要滚动的网格)将不会打印消息。

这也意味着它们未被正确创建,并且click="onCheckBoxClick()"未正确挂接,并且onCheckBoxClick()未被触发。

为什么会发生这种情况,我该如何解决这个问题?

+0

你可以在你的dataProvider和你的onCheckBoxClick()函数中添加更多细节吗?如果你也发布这些建议,我可以提供更好的建议。 – Brian 2014-09-23 15:33:54

回答

0

在Flex中,itemRenderer不是基于一对一的基础数据集合创建的。您只能获得足够的实例来显示一个屏幕的数据值,并且这些实例在滚动时会被重用。

要在代码中处理此问题,请重构,以便itemRenderer中的click处理程序更新dataCollection中的属性(例如data.foo = true;)。