ItemRenderers сохраняют состояния после изменения поставщика данных в списке

У меня следующая проблема с Datagrid. У меня есть comboBox, который меняет клиента, и как только клиент выбран, система заполняет Datagrid с помощью ItemRenderer, у которого есть CheckBox и два radioButton. Когда я в первый раз заполняю список, все работает нормально.

Проблема возникает, когда я меняю клиента и запускаю событие для изменения содержимого такого Datagrid. DataProvider Datagrid повторно объявляется как новый 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)"/>

Thanks.


person Apalabrados    schedule 06.02.2013    source источник
comment
Вам нужно ввести здесь код. Не догадываюсь о тебе.   -  person ethrbunny    schedule 06.02.2013


Ответы (1)


Вы только добавляете элементы в dataProvider сетки; кажется, ты никогда не удаляешь старые вещи. В таком случае; itemRenderers, отображающие в настоящее время данные, не будут обновлять свое отображение, потому что их данные не изменились.

Тем не менее, вы можете написать код, чтобы сообщить DataGrid, что элементы itemRenderers должны быть обновлены. Вы можете сделать это, заменив dataProvider следующим образом:

preciosGrid.dataProvider = myNewDataProvider;

или с помощью itemUpdated в своей коллекции.

precioClienteModel.modelo.arrayColumnaProductos.itemUpdated(item);

Итак, автор меняет свой dataProvider. Я подозреваю, что проблема в том, что у него слишком много уровней для работы привязки. DataProvider устанавливается следующим образом:

 dataProvider="{precioClienteModel.modelo.arrayColumnaProductos}"

Таким образом, Binding будет искать изменения в свойстве modelo объекта PrecioClienteModel; и modelo не изменяется, только его переменная экземпляра; и поэтому привязка не срабатывает. Одним из решений может быть сохранение экземпляра в modelo локально и установка его во время установки компонента, возможно, в установщике для PrecioClienteModel:

[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
}

Тогда я думаю, что привязка должна срабатывать правильно.

person JeffryHouser    schedule 06.02.2013
comment
Вопрос в том, что PreciosGrid.dataProvider указывает на PrecioClienteModel.modelo.arrayColumnaProductos, и этот arrayColletion сбрасывается следующим образом: PrecioClienteModel.modelo.arrayColumnaProductos = new ArrayColletion; - person Apalabrados; 06.02.2013
comment
Ты прав; Я пропустил этот фрагмент кода, когда делал обзор. Я подозреваю, что проблема в том, что у вас слишком много слоев для работы привязки. Я обновлю ответ, чтобы попытаться объяснить глубже. - person JeffryHouser; 06.02.2013
comment
Привет, я использую петрушку, поэтому вы это видите: PrecioClienteModel - это модель презентации, а modelo - это класс модели, в котором данные arrayColletion хранятся. У всех есть свой привязанный набор. Итак, вы говорите мне, что такая модель не запускает привязку после изменения ArrayCollection? и поэтому я должен создать промежуточную переменную, размещенную локально, чтобы управлять этим? - person Apalabrados; 06.02.2013
comment
@Apalabrados Да, я именно это и говорю. - person JeffryHouser; 06.02.2013