0

次のコードが機能しています。

アイテムレンダラー:

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 をリッスンしています。これは、編集モードに入るとレンダラーがサイズを変更 (拡大) し、編集中に動的に拡張できるためです。

4

2 に答える 2

0

この種のことを行う通常の方法は、から発送することですcommitProperties-

レンダラーで:

private var _editModeEntered:Boolean = false;

private var _editMode:Boolean;
public function set editMode(value:Boolean):void {
    _editMode = true;
    _editModeEntered = true;
    invalidateProperties();
}
// probably want a getter for editMode too

override protected function commitProperties():void {
    super.commitProperties();
    if (_enteredEditMode) {
        dispatchEvent(new Event("editLayoutChange"));
        _enteredEditMode = false;
    }
}

これにより、明示的に変更した場合にのみイベントがディスパッチされますeditMode

于 2013-07-25T16:15:45.407 に答える