Flex Custom ItemEditor появляется в неправильной ячейке при удалении строк - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть сетка данных с пользовательским ItemEditor для некоторых его столбцов.Один из них отображает комбинированный список.Когда пользователь делает определенный выбор, я добавляю дополнительные семь строк после измененного элемента.Если пользователь позже изменит этот выбор со списком, эти семь строк будут удалены.

У меня проблема, когда после добавления семи строк в сетку данных добавляется полоса прокрутки.Когда я изменяю поле со списком, чтобы удалить эти 7 элементов, они удаляются, полоса прокрутки исчезает, но предыдущий элемент в списке теперь отображает поле со списком вместо текущей выбранной строки.Изменение поля со списком изменяет значение как намеченного предмета, так и предшествующего ему.

Я вызываю обновление для поставщика данных после добавления / удаления 7 элементов, поскольку в этом случае также необходимо обновить другие столбцы в сетке данных.

Поведение не будет воспроизводиться, если я добавлюточка останова после удаления 7 элементов, но перед обновлением.В противном случае я получаю это странное поведение.Размещение обновления в callLater не имеет никакого эффекта.Я считаю, что это проблема связывания, как упомянул Сэм ДеХан.

Если это проблема привязки, я хотел бы использовать dataProxy, чтобы по возможности ее исправить.Мои данные представляют собой XML, и когда я пытаюсь установить что-либо вроде dataProxy.@label =, я получаю следующую ошибку:

ReferenceError: Ошибка # 1081: тип данных свойства не найден в Object и отсутствует значение по умолчанию.в mx.utils :: ObjectProxy / http://www.adobe.com/2006/actionscript/flash/proxy::setProperty()[E:\dev\4.x\frameworks\projects\framework\src\mx\utils\ObjectProxy.as:497] в Properties.SystemProperties.CustomTypes.EditorsAndRenderers :: SubtypeDatatyyItemEditor / updateValue ()..mxml: 60] at Properties.SystemProperties.flash.events::EventDispatcher/dispatchEventFunction () в flash.events::EventDispatcher/dispatchEvent () в mx.core :: UIComponent / dispatchEvent () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \mx \ core \ UIComponent.as: 12528] в mx.controls :: ComboBox / dispatchChangeEvent () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ controls \ ComboBox.as: 1888] вmx.controls :: ComboBox / закрыть () [E: \ DEV \ 4.x \ каркасов \ проекты \ рамки \ SRC \ тх \ управления \ ComboBox.as:1653] в mx.controls :: ComboBox / dropdown_changeHandler () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ controls \ ComboBox.as: 2146] в flash.events::EventDispatcher/dispatchEventFunction() в flash.events::EventDispatcher/dispatchEvent () в mx.core :: UIComponent / dispatchEvent () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ core \ UIComponent.as:12528] в mx.controls.listClasses :: ListBase / mouseUpHandler () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ controls \ listClasses \ ListBase.as: 10263] в mx.controls:: List / mouseUpHandler () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ controls \ List.as: 2469]

кажется, что ObjectProxy пытается установитьсвойство объекта без включения символа «@», поэтому возникает ошибка, поскольку объект XML не имеет свойства «label», только свойство «@label».

Вот мой код для ItemEditor,Просто замените dataProxy на данные, чтобы избежать вышеуказанной ошибки.

    <?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx"
     implements="mx.managers.IFocusManagerComponent">
<fx:Script>
    <![CDATA[
        //IMPORTS REMOVED           
        private var dataProxy:ObjectProxy;


        /**
         * returns the value the data is set to when the cell loses focus.
         */
        public function get value():String{
            if(data.@datatype != ""){
                return StringUtil.trim(String(data.@datatype));
            }
            return "Click to Edit";
        }


        /**
         * Sets the data for the renderer components when the cell receives focus.
         */
        override public function set data(item:Object):void{
            super.data = item;
            dataProxy = new ObjectProxy(data);
            SubtypeDatatype_cb.selectedIndex = Util.getSelIndex(SubtypeDatatype_cb.dataProvider, "data", String(dataProxy.@datatype));
            if(dataProxy.@enabled == "F")
                SubtypeDatatype_cb.enabled = false;
        }


        override public function setFocus():void{
            SubtypeDatatype_cb.setFocus();              
        }


        /**
         * Event listener on the renderer combo box.
         */
        private function updateValue():void{
            var removeChain:Boolean = dataProxy.@datatype == Constants.CHAIN
            var addChain:Boolean = SubtypeDatatype_cb.selectedItem.data == Constants.CHAIN;

            //set the datatype to the newly selected item.
            dataProxy.@datatype = SubtypeDatatype_cb.selectedItem.data;

            var dataList:ListCollectionView = ListCollectionView(ListBase(owner).dataProvider);
            var startIndex:int;
            var i:int;
            if(removeChain){
                startIndex = ListCollectionView(ListBase(owner).dataProvider).getItemIndex(data);
                //Remove the next seven CHAIN items.
                for(i = 0; i < 7; ++i){
                    if(dataList.getItemAt(startIndex + 1).@datatype == Constants.CHAIN){
                        dataList.removeItemAt(startIndex + 1);
                    }else{
                        //SHOULD ALWAYS HIT 7 OF THESE. If Not, we are BROKEN!!!!!
                        GlobalCalls.errorHandler("BAD THINGS HAVE HAPPENED", "ER1000");
                    }
                }
            }
            else if(addChain){
                var baseName = "Subtype"
                var subtypeNumber:int;
                var totalChains:int = 0;
                for(i = 0; i < dataList.getItemIndex(dataProxy); ++i){
                    if(dataList.getItemAt(i).@datatype == Constants.CHAIN){
                        if(totalChains % 8 == 0){
                            subtypeNumber++;
                        }
                        totalChains++;
                    }else if(dataList.getItemAt(i).@datatype != Constants.CHAIN){
                        subtypeNumber++;
                    }
                }
                baseName += (subtypeNumber + 1).toString();
                if(data.@label != ""){
                    baseName = String(data.@label);
                }else{
                    dataProxy.@label = baseName + "_1";
                }
                startIndex = dataList.getItemIndex(dataProxy) + 1;
                for (i = 0; i < 7; ++i){
                    dataList.addItemAt(new XML("<subtype label='" + baseName + "_" + (8 - i) + "' datatype='"+Constants.CHAIN+"' length='1' enabled='F' />"), startIndex);
                }
            }

            //Ensures that the SubtypeLengthItemRenderer is updated ASAP.
            ListCollectionView(ListBase(owner).dataProvider).refresh();
        }

    ]]>
</fx:Script>
<mx:ComboBox id="SubtypeDatatype_cb" width="95%" change="updateValue()" alpha="1" styleName="Dialog" y="2">
    <mx:dataProvider>
        <fx:Object label="Type 1" data="{Constants.TYPE1}"/>
        <fx:Object label="Type 2" data="{Constants.TYPE2}"/>
        <fx:Object label="Type 3" data="{Constants.TYPE3}"/>
        <fx:Object label="Type 4" data="{Constants.TYPE4}"/>
        <fx:Object label="Type 5" data="{Constants.CHAIN}"/>
    </mx:dataProvider>
</mx:ComboBox>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...