次のコードが機能しています。
アイテムレンダラー:
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
super.updateDisplayList(unscaledWidth, unscaledHeight);
if(editMode)
dispatchEvent(new Event("editLayoutChange"));
}
Datagrid (「editLayoutChange」のイベント ハンドラ関数 - 「viewport」は AdvancedDataGrid です):
public function editLayoutChange(event : Event) : void {
var viewportTopLeft : Point = viewport.localToGlobal(new Point(0,0));
var viewportBottom : Number = viewportTopLeft.y + viewport.height;
var rendererTopLeft : Point = Container(event.target).localToGlobal(new Point(0,0));
var rendererBottom : Number = rendererTopLeft.y + Container(event.target).getLayoutBoundsHeight();
var offset : Number = rendererBottom - viewportBottom;
if(offset > 0) {
// Typical item height is 21px
var itemHeight : Number = 21;
matrix.verticalScrollPosition += Math.ceil(offset / itemHeight);
}
}
しかし、 updateDisplayList のオーバーライドがかなりの頻度で実行されるため、最もクリーンな実装であるかどうかはわかりません。アイテム レンダラーの "resize" イベントに応答して "editLayoutChange" イベントをディスパッチしようとしましたが、非常に不安定な動作が見られます。updateDisplayList よりもこのイベントをディスパッチするためのより良い選択肢はありますか?
編集 - updateDisplayList をリッスンしています。これは、編集モードに入るとレンダラーがサイズを変更 (拡大) し、編集中に動的に拡張できるためです。