9

如果我在 MyView.ui.xml UiBinder 文件中定义我的 CellTable,如下所示:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:c="urn:import:com.google.gwt.user.cellview.client"
ui:generateFormat='com.google.gwt.i18n.rebind.format.PropertiesFormat'
ui:generateKeys='com.google.gwt.i18n.rebind.keygen.MD5KeyGenerator'
ui:generateLocales='default' xmlns:p1="urn:import:com.google.gwt.user.cellview.client">
        ...
    <g:HTMLPanel>           
      <c:CellTable
        addStyleNames='{style.cellTable}'
        pageSize='15'
        ui:field='cellTable' width="100%">  
       </c:CellTable>           
    </g:HTMLPanel>

然后以编程方式将列添加到 CellTable,一切正常。

但为了减少样板代码,我还想在我的 UiBinder 文件中定义表列。我试过这个:

    ...
    <g:HTMLPanel>           
      <c:CellTable
        addStyleNames='{style.cellTable}'
        pageSize='15'
        ui:field='cellTable' width="100%">  
            <c:TextColumn 
                addStyleNames='{style.titleColumn}'
                ui:field="titleColumn"/>
       </c:CellTable>           
    </g:HTMLPanel>

但它会产生以下错误:

[错误] [方言] - 发现意外的子元素元素 addStyleNames='{style.titleColumn}'ui:field='titleColumn'> (:33)

如何使用 UiBinder 定义整个 CellTable?

4

1 回答 1

5

显然,在第二个清单中,您尝试将列添加为子对象。单元格表不直接接受孩子(意味着没有 addChild(...) 方法)。

如果您有固定数量的列并且想要使用 UIBinder,请考虑仅使用 HTML 表格。在这种情况下,您将拥有 XML 文件中的所有列,但该表将变得更难使用 - HtmlElement 而不是 Widget。

<table ui:field="table">
    <col ui:field="firstColumn" class="{style.firstColumn}">
    <col ui:field="secondColumn"  class="{style.secondColumn}">
    ...
</table>

代码可能如下所示

... 
@UiField
private TableColElement firstColumn;

@UiField
private TableColElement secondColumn;

但是对表的所有其他操作都将通过 DOM。像 table.appentChild(rowElement)。我认为这样做不值得。

于 2012-08-06T18:08:47.700 回答