【问题标题】:ItemRenderers keep states after changes dataprovider in ListItemRenderers 在 List 中更改 dataprovider 后保持状态
【发布时间】:2013-02-06 12:29:04
【问题描述】:

我对 Datagrid 有以下问题。我有一个可以更改客户端的组合框,一旦选择了客户端,系统就会使用具有 CheckBox 和两个单选按钮的 ItemRenderer 填充 Datagrid。我第一次填充列表时,一切正常。

当我更改客户端并触发事件以更改此类 Datagrid 的内容时,问题就出现了。 Datagrid dataProvider 被重新声明为新的 ArrayCollection 并迭代填充新信息。

问题是尽管内容发生了变化,但复选框的状态保持不变。

这里发生了什么?看不懂。

编辑

            private function showProductosTable(evt:ResultEvent, token:Object):void {
            precioClienteModel.modelo.arrayPanelPrecioCliente   = new ArrayCollection;

            for each(var data:Object in evt.result as ArrayCollection) {
                var pc:PanelPrecioClienteDatatype = new PanelPrecioClienteDatatype;
                pc.ID                       = data.ID;
                pc.clienteID                = data.clienteID;
                pc.productoID               = data.productoID;
                pc.producto                 = data.producto;
                pc.proveedorID              = data.proveedorID;
                pc.proveedor                = data.proveedor;
                pc.productos_proveedorID    = data.productos_proveedorID;
                pc.cantidad_80              = data.cantidad_80;
                pc.cantidad_100             = data.cantidad_100;
                pc.kg_caja_80               = data.kg_caja_80;
                pc.kg_caja_100              = data.kg_caja_100;
                precioClienteModel.modelo.arrayPanelPrecioCliente.addItem(pc);
                // Comprobamos si ya tenemos metido el ProductoID en nuestra Columna de Productos
                if ( !precioClienteModel.checkIfProductIDInList( pc.productoID ) ) {
                    precioClienteModel.modelo.arrayColumnaProductos.addItem( {'productoID':pc.productoID, 'producto':pc.producto,
                                                                                'proveedor1': {'value':0, 'selected':false},
                                                                                'proveedor2': {'value':0, 'selected':false},
                                                                                'proveedor3': {'value':0, 'selected':false},
                                                                                'proveedor4': {'value':0, 'selected':false},
                                                                                'proveedor5': {'value':0, 'selected':false},
                                                                                'proveedor6': {'value':0, 'selected':false},
                                                                                'proveedor7': {'value':0, 'selected':false},
                                                                                'proveedor8': {'value':0, 'selected':false},
                                                                                'proveedor9': {'value':0, 'selected':false},
                                                                                'proveedor10': {'value':0, 'selected':false},
                                                                                'proveedor11': {'value':0, 'selected':false},
                                                                                'proveedor12': {'value':0, 'selected':false},
                                                                                'proveedor13': {'value':0, 'selected':false},
                                                                                'proveedor14': {'value':0, 'selected':false},
                                                                                'proveedor15': {'value':0, 'selected':false}} );
                }
                if ( !precioClienteModel.checkIfProveedorIDInList( pc.proveedorID ) ) {
                    precioClienteModel.modelo.arrayFilaProveedores.addItem( {'proveedorID':pc.proveedorID, 'proveedor':pc.proveedor} );
                }
            }

}

数据网格是:

<s:DataGrid id="preciosGrid" top="65" width="935" height="379" horizontalCenter="0" requestedRowCount="4"
            dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}">
    <s:columns>
        <s:ArrayList>
            <s:GridColumn dataField="producto"      headerText="Producto" width="150" editable="false"></s:GridColumn>
            <s:GridColumn dataField="proveedor1"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor2"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor3"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor4"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor5"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor6"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor7"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor8"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor9"    headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor10"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor11"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor12"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor13"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor14"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
            <s:GridColumn dataField="proveedor15"   headerText="" width="52" editable="true" itemRenderer="renderers.PriceCellItemRenderer"></s:GridColumn>
        </s:ArrayList>
    </s:columns>
</s:DataGrid>

和 ItemRenderer:

<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Script>
    <![CDATA[
        import mx.controls.dataGridClasses.DataGridListData;
        import mx.controls.listClasses.BaseListData;

        import spark.components.DataGrid;

        private var _listData:BaseListData;
        [Bindable]private var isSelected:Boolean = false;

        override public function prepare(hasBeenRecycled:Boolean):void {
        }

        protected function lblData_doubleClickHandler(event:MouseEvent):void {
            isSelected = !isSelected;
            data[column.dataField]['selected'] = isSelected;
        }

        override public function set data( value:Object ) : void  {
            super.data = value;
            if (value != null)
                lblData.text = data[column.dataField]['value'];
        }

        [Bindable]public function get listData() : BaseListData {
            return _listData;
        }
        public function set listData( value:BaseListData ) : void {
            _listData = value;
        }

    ]]>
</fx:Script>

<s:Rect width="100%" height="100%">
    <s:fill>
        <s:SolidColor color="{isSelected?0xCDCDCD:0xFFFFFF}"/>
    </s:fill>
</s:Rect>
<s:Label id="lblData" width="100%" height="100%" 
         textAlign="center" verticalAlign="middle"
         doubleClickEnabled="true" doubleClick="lblData_doubleClickHandler(event)"/>

谢谢。

【问题讨论】:

  • 你需要在这里放一些代码。不用猜了。

标签: actionscript-3 apache-flex flex4.5 flexbuilder itemrenderer


【解决方案1】:

您只需将项目添加到网格的 dataProvider;您似乎从不删除旧物品。在这种情况下;当前显示数据的 itemRenderer 不会更新它们的显示,因为它们的数据没有改变。

也就是说,您可以编写代码来告诉 DataGrid 必须刷新 itemRenderers。您可以通过替换 dataProvider 来做到这一点,如下所示:

preciosGrid.dataProvider = myNewDataProvider;

或在您的收藏中使用itemUpdated 方法。

precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item);

所以发帖人正在更改他的 dataProvider。我怀疑问题在于他的级别太深而无法绑定工作。 dataProvider 是这样设置的:

 dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}"

因此,Binding 将查找 preoClienteModel 对象上的 modelo 属性的更改;并且 modelo 没有改变,只是它的一个实例变量;因此不会触发绑定。一种解决方案可能是将实例存储到本地模型,并在组件设置期间设置它,可能在 preioClienteModel 的设置器中:

[Bindable]
protected var modelo : ModeloType;

private var _precioClientModel : PrecioClienteModelType;

public function get precioClientModel(value:PrecioClienteModelType):void{
 return _precioClientModel;
}
public function set precioClientModel(value:PrecioClienteModelType):void{
  modelo = precioClienteModel.modelo
}

那么我认为应该正确触发绑定。

【讨论】:

  • 问题是 preciosGrid.dataProvider 指向“precioClienteModel.modelo.arrayColumnaProductos”并且此arrayColletion 重置如下: precioClienteModel.modelo.arrayColumnaProductos = new ArrayColletion;
  • 你是对的;在进行审查时,我错过了那段代码。我怀疑问题是你的层太深而无法绑定工作。我会更新答案以尝试更深入地解释。
  • 您好,我使用的是 parsley,这就是您看到此内容的原因:precioClienteModel 是表示模型,而 modelo 是 arrayColletion 数据保存数据的模型类。都有它的 Bindable 集。那么,您告诉我,一旦 ArrayCollection 更改,这种模型就不会触发绑定?这就是为什么我应该创建一个放置在本地的中间变量来管理它?
  • @Apalabrados 是的,这正是我要说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
相关资源
最近更新 更多