Spark Listを使用していて、データプロバイダーであるリストのコンテンツを変更した後も選択を維持したいと考えています。新しいデータプロバイダーを設定すると、リストはそのselectedIndexを-1に戻します。この問題は、リストが自分自身を-1に戻したいときに発生するvalueCommitイベントをインターセプトし、以前に選択したアイテムを設定することで解決しました(新しいデータプロバイダーにまだ含まれている場合)。これは今のところ機能しますが、奇妙な動作をしています。
- 最初に、以前に選択されたアイテムが引き続き選択され、意図したとおりに強調表示されます
- 別のアイテムが選択された場合、強調表示は最初のアイテムにとどまります。別のアイテムを選択する頻度は関係ありません。最初のアイテムは強調表示されますが、選択されません。新しく選択されたアイテムが実際に選択され、強調表示されます。
- 最初の項目を再度選択すると、リストは再び正常に動作します。最初のアイテムを一度再選択した後で別のアイテムを選択すると、強調表示が消えます。
リストは、次のように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は、元に/やり直しを処理するクラスです。無視関数は、ユーザーの操作のみを元に戻すことができるため、undoManagerがdataProviderに変更を元に戻すことができるアクションとして登録しないように注意します。
何か案は?