欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

zk6中listbox设置了checkmark="true" multiple="true" 没用的问题

程序员文章站 2022-04-12 11:42:54
...

 

 大家用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,感谢”未来之路”的对这个问题感兴趣。