zk6中listbox设置了checkmark="true" multiple="true" 没用的问题
程序员文章站
2022-05-16 11:45:31
...
大家用zk6有没有遇到listbox设置了checkmark="true" multiple="true" 运行后只显示radio不能显示checkbox的问题?
首先,请大家注意你的数据对象是ListModelList还是List,使用ListModelList是有原因的;
1.如果是ListModelList,那么请在new ListModelList之后
datas.setMultiple(true);
如果直接使用的是List对象,则不用设置,checkbox是会显示的,但是两者都没有全选框。
2.[不建议使用]即使你设置以后你会发现,在listheader中的全选按钮没有了,这时如果我们还是自己实现一个全选功能的话,在listhead中添加代码:
<listhead width="100%">
<listheader width="45px">
<checkbox>
<attribute name="onCheck">
if (self.isChecked()) {
lbx.selectAll();
} else {
lbx.clearSelection();
}</attribute>
</checkbox>
</listheader>
...
</listhead>
即可解决checkbox不显示的问题。ok。
注意:如果这样做在zk6中实现的全选其实是5版本的功能,用在mvc的模式下是可以用,但对于6来说并没有意义,zk6没有全选是有原因的,它使用了ListModelList,在界面上逐个选择时可以触发事件,通知ListModelList,数据的选择状态被改变了,然后就可以在类中直接使用datas.getSelection()得到被选中的记录Set.所以从ZK6升级后listbox的这一改变来看,MVVM的设计模式正在逐步的演化,后面的版本定会更加的完善,可能会完成脱离MVC的设计模式,这样一来,冗余度将大大的降低。
3.[建议方法]那么应该如何解决这一问题呢,当然是通过注册一个事件来改变ListModelList的选择状态。
<listhead width="100%"> <listheader width="45px"> <checkbox onCheck="@command('selectAllOrCancel',var=self.checked)"/> </listheader> ... </listhead>
后台Java类:
@Command @NotifyChange("datas") public void selectAllOrCancel(@BindingParam("var") boolean checked) { if (checked) datas.setSelection(datas); else datas.clearSelection(); }
这时写一个测试方法就可以验证:
@Command @NotifyChange({ "totalSize", "datas" }) public void activate() { for (User u : datas.getSelection()) { System.out.println(u.getName()); }
ok,感谢”未来之路”的对这个问题感兴趣。