如果你想自己处理数据源和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>