0

Flexには穴がたくさんあり、正しく機能させるには多くのハックが必要ですが、私はそれを正しく機能させるための正しい道を進んでいると思います。私が実装しようとしている問題と解決策について説明します。正しい道を教えていただければ幸いです。

私がやろうとしているのは、Spark DataGrid列の幅をSparkラベルの幅にバインドすることです。これが最初の穴です。GridColumnにはバインドプロパティ「width」がありますが、オブジェクトの作成が完了した後は準備ができていません。ユーザーの操作後にのみ公開されます。そこで、最初のハックを思いつきました。DataGrid自体から列幅を抽出し、列が作成されたとき、または列のサイズが変更されたときにトリガーされるイベントにバインドされる関数で、次のように機能します。

[Bindable(event="creationComplete")]
[Bindable(event="columnStretch")]
[Bindable(event="propertyChange")]
public function columnWidth(grid:DataGrid, column:GridColumn):int {
    if(isNaN(column.width)){
        if(column.grid){
            return column.grid.getColumnWidth(grid.columns.getItemIndex(column));
        }
    }
    return column.width;
}

作成時に幅を取得するように機能しますが、バインド可能なプロパティが機能するため、カーソルで列の幅を設定すると機能しません。したがって、ラベルの幅をそのように設定すると、次のようになります。 :幅はユーザーの操作後に変更されますが、グリッドの作成が完了した後は変更されません。グリッドの完成後に幅を変更して幅を設定したが、ユーザーの操作に反応しない場合...

何か助けはありますか?

4

2 に答える 2

1

しばらく前に同じ問題が発生したようです。そしてそれを修正しました:次のアプローチは私にとってうまくいきました。列の幅に基づいてラベルのサイズを変更する関数があるとします。

protected function layoutTextInputs():void {
    var numCols:int = dataGrid.columns.length;
    var w:Number = 0;

    for (var i:int=1; i<numCols; i++) {
        var header:Rectangle = dataGrid.columnHeaderGroup.getHeaderBounds(i);
        var textInput:IVisualElement = textInputs.getElementAt(i - 1);

        textInput.left = header.x;
        textInput.width = header.width;
    }
}

この例textInputsでは、Group各列のTextInputが含まれています。これは、その列の真上に配置され、同じ幅です。

ここで、ユーザーが列のサイズを変更するたびにこの関数を呼び出したいので、次のようにします。

dataGrid.columnHeaderGroup.addEventListener(
    GridEvent.SEPARATOR_MOUSE_DRAG, onHeaderResize);
dataGrid.columnHeaderGroup.addEventListener(
    GridEvent.SEPARATOR_MOUSE_UP, onHeaderResize);

private function onHeaderResize(event:GridEvent):void {
    layoutTextInputs();
}

ただし、残念ながら、これは初期化時や、ユーザーの操作以外の方法で列の幅を変更する方法で画面が再描画されたときにメソッドを実行しません。幸い、これは簡単に修正できます。

override protected function updateDisplayList(
    unscaledWidth:Number, unscaledHeight:Number):void 
{
    super.updateDisplayList(unscaledWidth, unscaledHeight);
    layoutTextInputs();
}

編集:Flexの「穴」に関するメモ。

GridColumnはビジュアルコンポーネントではありません。これは、グリッドレイアウトに(実際の)列をレンダリングする方法を指示するプレゼンテーションモデルです。widthしたがって、そのプロパティは、列の幅の実際の値としてではなく、そのような命令として解釈する必要があります。
デフォルトでは、列の幅はその内容と使用可能なスペースに基づいて決定されます。プロパティはwidth、代わりにカスタム量のピクセルを使用するようにグリッドレイアウトに指示します。

于 2013-03-09T22:24:33.887 に答える
0

私はを使用してmx:AdvancedDataGridいます。データグリッド列にIDを割り当てるだけです。inputTextそして、必要に応じて列幅プロパティをバインドしました。わたしにはできる...

例えば:

<s:textInput width="{myDatagridColumnID.width - 10}" />

私はFlashBuilder4.6で作業しています。

于 2013-03-09T12:16:44.740 に答える