在数据源和UI组件间定制转换

如果你想自己处理数据源和UI组件间的转换,可以在converter标签表达式中指定转换器的类名,以告诉数据绑定关理器使用你自己的方式来处理数据源和UI组件间的转换。

<component-name attribute-name="@{bean-name.attribute-name,converter='class-name'}"/>

不允许多重定义,后面的定义会重写前面的定义。

  1. 定义一个实现了TypeConverter的类,并实现下面的方法

    1. coerceToUI,将一个值对象转换成UI组件属性类型。
    2. coerceToBean,将一个值对象转换成bean属性类型。
  2. 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>