У меня есть сетка данных с пользовательским 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>