我想使一个特定的单元格可编辑时行在WLISTBOX中选择在ZK框架?
因为没有答案是你想要MVVM还是MVC,我决定用MVVM
这是一把可以使用的小提琴。
我将最重要的代码粘贴在这里,当链接不能再工作时:
<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>
小说明,如果使用以前的zk8你可以使用这个。
因此,我们在zul中检查所选项目是否等于(eq
)或不等于(ne
)呈现的项目。
然后我们改变组件的可见性。
如果工作ZK8或更高,可以使用<if test="load(vm.selected eq item)">
。
有了这个,它的工作与阴影元素和条件什么是不为真将不会被渲染(不在DOM),而工作与可见,它将在DOM。
在早期ZK8中使用if
属性仅与${}
表达式结合使用,MVVM语法将无法工作。
因为它只是静态的,所以你不能用它来实时切换。
这就是为什么我们需要使用visible
属性的原因。
这是一个迟来的响应,但仍然值得记录。
在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();
}