selectedItem已在Flex中的dataProvider更新中删除



flex中,我使用的组件显示其dataProvider(ListCollectionView)中的特定项(selectedItem字段)。

我的dataProvider的元素可以通过不同的方式进行编辑。每次编辑一个时,都会发送一个更新事件,从而更新dataProvider集合(ListCollectionView::listChangeHandler)。

在此过程中,如果我的selectedItem是已编辑的元素,它将被擦除(通过ListCollectionView::moveItemInView设置为null),即使已编辑的字段没有被使用。

有办法避免这种情况吗

更具体地说,无需之前保存、丢失并在之后恢复(这在这里几乎不可行)


编辑:好的,我想我可以进一步解释:

在我的代码中,我对列表中的一个项的属性进行了修改,该项被数据绑定到dataProvider。我不知道确切的原因,可能是因为项的类是[bindable],所以这会引发一个更新事件。

ArrayList::itemUpdateHandler捕获此事件,并将其分派到ListCollectionView::listChangeHandler。在这一点上,事件"种类"是"更新",这对我来说似乎还可以…

但从那里,它进入ListCollectionView::moveItemInView(我认为这很有意义,因为如果列表排序,项目应该必须更新其位置)。此函数将项目从以前的位置删除,并将其添加到新位置。

当它删除它时,它会发送一个具有"remove"类型的新事件。这就是问题所在:我的组件监听它使用的数据的remove事件,如果删除了这个元素,就会删除它的selectedItem。

我认为是在调用moveItemInView时出现了问题:ListCollectionView::handlePropertyChangeEvents中的调用(由listChangeHandler调用)为:moveItemInView(updateEntry.item、updateEntry.item、eventItems);(其中updateEntry.item是列表的修改项,eventItems是空数组)

而其原型是:私有函数moveItemInView(item:Object,dispatch:Boolean=true,updateEventItems:Array=null):void

那是个虫子吗?

如何更新dataProvider?如果是这个

list.dataProvider = newDataProvider

然后你看到的行为是意料之中的。从List的角度来看,您已经完全替换了dataProvider,并且List无法知道旧的selectedItem/selectedIndex是否仍然有效。我认为这是一个正确的假设,假设它不是。

还是使用dataProvider的刷新方法更新dataProvider:

list.dataProvider.refresh();

在这种情况下,dataProvider的长度可能会发生变化;它的元素也是如此。在这种情况下,将调度collectionChange事件,并且列表应该有一个处理collectionChange的方法。列表无法知道以前选择的项目是否会在新列表中;其索引是否会更改,或者旧的selectedIndex是否仍然有效。因此,selectedItem被重置。

通常,为了在任何一种情况下保留selectedItem/selectedIndex,您都应该存储对它的引用,并在dataProvider更改后重置它:

mySelectedItem = list.dataProvider.selectedItem;
// update dataProvider Here
list.dataProvider.selectedItem = mySelectedItem;

如果您只是在更新dataProvider中的一个项目;则selectedIndex/selectedItem不应受到影响。

最新更新