如果你想自己处理数据源和UI组件间的转换,可以在converter标签表达式中指定转换器的类名,以告诉数据绑定关理器使用你自己的方式来处理数据源和UI组件间的转换。
<component-name attribute-name="@{bean-name.attribute-name,converter='class-name'}"/>
不允许多重定义,后面的定义会重写前面的定义。
定义一个实现了TypeConverter的类,并实现下面的方法
coerceToUI,将一个值对象转换成UI组件属性类型。coerceToBean,将一个值对象转换成bean属性类型。converter标签标表达式内指定转换器的类名。在下面的例子中,我们将展示如何将一个boolean值转换成不同的图像以代替纯文本。
myTypeConverter 将boolean 转换成相应的不同图像。
import org.zkoss.zkplus.databind.TypeConverter;
import org.zkoss.zul.Listcell;
public class myTypeConverter implements TypeConverter {
public Object coerceToBean(java.lang.Object val, org.zkoss.zk.ui.Component comp) {
return null;
}
public Object coerceToUi(java.lang.Object val, org.zkoss.zk.ui.Component comp)
{
boolean married = (Boolean) val;
if (married)
((Listcell) comp).setImage("/img/true.png");
else
((Listcell) comp).setImage("/img/false.png");
return null;
}
}
使用convert标签标表达式指定myTypeConverter与Person实例的married属性关联。
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit"?>
<window width="500px">
<zscript><![CDATA[
//prepare the example persons List
List persons = new ArrayList();
persons.add(new Person("Tom", "Yeh", true));
persons.add(new Person("Henri", "Chen", true));
persons.add(new Person("Jumper", "Chen", false));
persons.add(new Person("Robbie", "Cheng", false));
]]>
</zscript>
<listbox rows="4" model="@{persons}">
<listhead>
<listheader label="First Name" width="100px" />
<listheader label="Last Name" width="100px" />
<listheader label="Married" width="100px" />
</listhead>
<listitem self="@{each=person}">
<listcell label="@{person.firstName}"/>
<listcell label="@{person.lastName}"/>
<listcell label="@{person.married, converter='myTypeConverter'}"/>
</listitem>
</listbox>
</window>