我希望在ZK框架中的WLISTBOX中选择行时使特定单元格可编辑?
答案 0 :(得分:3)
因为没有答案你想要MVVM或MVC我决定去MVVM。
Here is a working fiddle.
我在这里粘贴了最重要的代码,以便链接不再适用时:
<listbox model="@load(vm.items)" selectedItem="@bind(vm.selected)" hflex="true" height="300px">
<listhead>
<listheader label="Name" width="80px"/>
<listheader label="Price" align="center" width="80px" />
<listheader label="Quantity" align="center" width="80px" />
</listhead>
<template name="model" var="item">
<listitem >
<listcell>
<label visible="@load(vm.selected ne item)" value="@load(item.name)" />
<textbox visible="@load(vm.selected eq item)" value="@bind(item.name)" />
</listcell>
<listcell>
<label visible="@load(vm.selected ne item)" value="@load(item.price)" />
<intbox visible="@load(vm.selected eq item)" readonly="true" value="@bind(item.price)" />
</listcell>
<listcell>
<label visible="@load(vm.selected ne item)" value="@load(item.quantity)" />
<intbox visible="@load(vm.selected eq item)" readonly="true" value="@bind(item.quantity)" />
</listcell>
</listitem>
</template>
</listbox>
很少说明,如果使用之前的ZK 8,你可以使用它。
因此,如果所选项目等于(eq
)或者不等于(ne
),则我们会检查zul是否为渲染项目。
然后我们改变该组件的可见性。
如果使用ZK8或更高版本,您可以使用<if test="load(vm.selected eq item)">
有了这个,它就会使用阴影元素,并且不会呈现不是真实的条件(不在DOM中),而使用可见的它将在DOM中。
仅在早期ZK8中使用if
属性与${}
表达式结合使用,MVVM语法无法正常工作。
而且因为它只是静态的,所以你不能用它来实时切换
这就是我们需要使用visible
属性的原因。
答案 1 :(得分:2)
这是一个迟到的回应,但值得记录。
在ZK的ADempiere实现中,WListbox使用WListBoxRenderer渲染行和行中的所有单元格。定义每列的类并将其应用于所有行,使行相同。 WListBoxRenderer使用此类来确定用于显示字段的组件以及用于编辑字段的组件。只有在初始化表时将列定义为读/写时,才会启用编辑器。您可以使用ColumnInfo结构或通过下面显示的setColumnClass()和setColumnReadWrite()方法执行此操作。
/**
* Set the attributes of the column.
*
* @param index The index of the column to be modified
* @param classType The class of data that the column will contain
* @param readOnly Whether the data in the column is read only
* @param header The header text for the column
*
* @see #setColumnClass(int, Class, boolean)
*/
public void setColumnClass (int index, Class classType, boolean readOnly, String header)
{
WListItemRenderer renderer = (WListItemRenderer)getItemRenderer();
setColumnReadOnly(index, readOnly);
renderer.setColumnHeader(index, header);
renderer.setColumnClass(index, classType);
if (index < m_modelHeaderClass.size())
m_modelHeaderClass.set(index, classType);
else
m_modelHeaderClass.add(classType);
return;
}
/**
* Set Column at the specified <code>index</code> to read-only or read/write.
*
* @param index index of column to set as read-only (or not)
* @param readOnly Read only value. If <code>true</code> column is read only,
* if <code>false</code> column is read-write
*/
public void setColumnReadOnly (int index, boolean readOnly)
{
Integer indexObject = new Integer(index);
// Column is ReadWrite
if (m_readWriteColumn.contains(indexObject))
{
// Remove from list
if (readOnly)
{
m_readWriteColumn.remove(indexObject);
} // ReadOnly
}
// current column is R/O - ReadWrite - add to list
else if (!readOnly)
{
m_readWriteColumn.add(indexObject);
}
return;
} // setColumnReadOnly
以下是用于在“付款分配”表单中显示发票的示例。 IMiniTable接口由WListBox类实现。请注意,其中三列设置为readOnly = false,因此表中的这些单元格是可编辑的。
public void setInvoiceColumnClass(IMiniTable invoiceTable, boolean isMultiCurrency)
{
Vector<String> names = getInvoiceColumnNames(isMultiCurrency);
int i = 0;
invoiceTable.setKeyColumnIndex(i);
invoiceTable.setColumnClass(i, IDColumn.class, true, names.get(i++)); // 0-C_Invoice_ID
invoiceTable.setColumnClass(i, Timestamp.class, true, names.get(i++)); // 1-TrxDate
invoiceTable.setColumnClass(i, String.class, true, names.get(i++)); // 2-Value
if (isMultiCurrency)
{
invoiceTable.setColumnClass(i, String.class, true, names.get(i++)); // 3-Currency
invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++)); // 4-Amt
}
invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++)); // 5-ConvAmt
invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++)); // 6-ConvAmt Open
invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++)); // 7-Conv Discount
invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++)); // 8-Conv WriteOff
invoiceTable.setColumnClass(i, BigDecimal.class, false, names.get(i++)); // 9-Conv Applied
invoiceTable.setColumnClass(i, BigDecimal.class, true, names.get(i++)); // 10-Conv OverUnder
// Table UI
invoiceTable.autoSize();
}