为什么我的flex复选框itemrenderer更新了错误的数据源?

时间:2012-03-16 21:37:04

标签: flex datagrid checkbox datasource itemrenderer

我有两个tile列表,它们从分配给datagrid的数组集合中绘制数据:

<mx:TileList dataProvider="{myDatagrid.selectedItem.myColumnOne}">
 <mx:itemRenderer >
  <mx:Component>
   <mx:CheckBox label="{data.label}" selected="{data.selected}" click="{data.selected = this.selected}" />
  </mx:Component>
 </mx:itemRenderer>
</mx:TileList>

<mx:TileList dataProvider="{myDatagrid.selectedItem.myColumnTwo}" >
 <mx:itemRenderer >
  <mx:Component>
   <mx:CheckBox label="{data.label}" selected="{data.selected}" click="{data.selected = this.selected}" />
  </mx:Component>
 </mx:itemRenderer>
</mx:TileList>

这些切片列表不在数据网格中 - 它们是编辑形式。

myColumnOne&amp; myColumnTwo有类似的数据:

{label:foo;选中:true}
{label:bar;选中:false}
等...

当数据加载到网格中时,复选框会正确填充。问题是,在检查/取消选中时,如果同一标签出现在myColumnOne&amp; myColumnTwo,两列都被更新,而不仅仅是被点击的列。

是否有任何代码更改可以使其正常运行?

1 个答案:

答案 0 :(得分:0)

问题是它们必须引用相同的底层对象,你需要克隆用于列表的dataProviders的对象,只有两个不同的集合并不意味着集合中的对象是不同的(这是好的对于内存性能,但不适合您的情况)。因此,无论您在哪里填充myColumnTwo和myColumnOne,您都必须对放入其中的对象进行“深层复制”,否则它们会共享内存。根据AS3的深层复制意味着创建一个新的对象(如果是这种情况,可以强类型化)并将原始对象的所有属性复制到新的克隆。

另外,您可能想要考虑将项目渲染器定义实际放在他们自己的mxml中,我倾向于在以这种方式内联时理解范围时遇到问题,您认为通过这种方式获得的任何好处都是可能不值得。