Flex 4.6绑定到Spark GridColumn宽度

时间:2013-03-09 00:18:55

标签: actionscript-3 flex data-binding flex4.5

我知道Flex充满了漏洞,它需要大量的黑客才能让它正常工作,但我认为我正在走上正确的道路。我将描述我正在尝试实施的问题和解决方案,我希望你能指出我正确的道路。

我要做的是将Spark DataGrid列的宽度绑定到Spark Label的宽度,这是第一个漏洞:GridColumn具有绑定属性“width”但是在创建对象后它还没有准备好完成,它只在用户交互后发布。所以我提出了第一个hack:一个从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;
}

它可以在创建时检索宽度,但是当我用光标设置列的宽度时它不起作用,因为任何可绑定属性都可以工作,所以事情是这样的:如果我设置宽度标签如下:宽度在用户交互后更改,但在网格创建完成后不会更改。如果我设置宽度在网格完成后更改了宽度,但它不会对用户交互作出反应......

任何帮助?

2 个答案:

答案 0 :(得分: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();
}

修改:关于“漏洞”的说明&#39;在Flex。

GridColumn不是可视组件。它是一种表示模型,用于指示网格布局如何呈现其(实际)列。因此,您必须将其width属性解释为此类指令,而不是列宽度的实际值。
默认情况下,列的宽度是根据其内容和可用空间确定的。 width属性指示网格布局使用自定义数量的像素。

答案 1 :(得分:0)

我正在使用mx:AdvancedDataGrid。我只是将一个ID分配给datagrid列。我根据要求将列宽属性与inputText绑定在一起。它对我有用......

例如:

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

我在Flash Builder 4.6中工作。