我正在使用火花列表,并希望在更改作为数据提供者的列表内容后保持选择。如果您设置一个新的数据提供者,List 会将其 selectedIndex 设置回 -1。我们通过拦截当 List 想要将自身设置回 -1 并设置先前选择的项目(如果新的数据提供者仍然包含它)时触发的 valueCommit 事件来解决这个问题。到目前为止这有效,但我们得到了奇怪的行为:
- 最初,先前选择的项目仍被选中并按预期突出显示
- 如果选择了另一个项目,突出显示将停留在初始项目上。不管我多久选择另一个,初始项目仍然突出显示但未选择。新选择的项目实际上已被选中并突出显示。
- 如果再次选择初始项目,则列表再次表现正常。当我在重新选择第一个项目后选择另一个项目时,突出显示消失。
List 在 MXML 中声明,如下所示:
<s:List dataProvider="{model.dataProvider}"
selectedIndex="@{model.selectedIndex}"
valueCommit="model.handleInputObjectListValueCommit(event)"/>
模型类中的代码非常复杂,但这应该是相关部分:
[Bindable]
public var dataProvider:ArrayCollection;
[Bindable]
public var selectedIndex:int;
private var _indexToSelect:int = -1;
public function setNewContent(newContent:ArrayCollection):void {
undoManager.ignore(function ():void {
dataProvider.removeAll();
dataProvider.addAll(newContent);
_indexToSelect = selectedIndex;
});
}
public function handleValueCommit(event:Event):void {
if (_indexToSelect != -1) {
const localIndex:int = _indexToSelect;
_indexToSelect = -1;
selectedIndex = localIndex;
}
}
undManager 是一个负责撤销/重做的类。ignore 函数注意 undoManager 不会将 dataProvider 中的更改注册为可撤消的操作,因为只有用户交互应该是可撤消的。
有任何想法吗?