在ZK Framework中使用MVVM的奇怪的Checkbox行为

时间:2014-06-08 09:27:00

标签: mvvm checkbox zk

我在MVVM中发现了zk复选框的奇怪行为。我制作了一个MVVM表单,显示项目列表和所选项目的详细视图。我在详细视图上放置了复选框并将其绑定到我的POJO的布尔属性。当我选中具有此属性的true值的项目时,复选框显示为选中状态,但接下来当我选择具有false属性值的项目,然后选择具有true value的项目时,复选框将显示为未选中。 我可以使用ZK的MVVM教程http://books.zkoss.org/wiki/ZK_Getting_Started/Get_ZK_Up_and_Running_with_MVVM来解释这个问题(源代码http://sourceforge.net/projects/zkbook/files/GettingStarted/getzkup-20131127.zip/download

添加到Car类布尔属性:

private Boolean cool = false;

public Car(Integer id, String model, String make, String description,  String preview, Integer price, boolean cool){
    this.id = id;
    this.model = model;
    this.make = make;
    this.preview = preview;
    this.description = description;
    this.price = price;
    this.cool = cool;
}

public Boolean getCool() {
    return cool;
}

public void setCool(Boolean cool) {
    this.cool = cool;
}

更改CarServiceImpl.java以初始化我们演示的布尔属性:

carList.add(
            new Car(id++, 
                    "Camry",
                    "Toyota",
                    "The Toyota Camry is a midsize car ... ",
                    "/img/car3.png",
                    24170, true));
carList.add(
            new Car(id++, 
                    "Century",
                    "Toyota",
                    "The Toyota Century is ... " ,          
                    "/img/car4.png",
                    28730, true));

更改searchMvvm.zul(添加标记为INSERTED的行):

<window title="Search" width="600px" border="normal" apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('tutorial.SearchViewModel')">
<hbox align="center">
    Keyword:
    <textbox value="@bind(vm.keyword)" />
    <button label="Search" image="/img/search.png" onClick="@command('search')" />
</hbox>
<listbox height="160px" model="@bind(vm.carList)" emptyMessage="No car found in the result"
selectedItem="@bind(vm.selectedCar)">
    <listhead>
        <listheader label="Model" />
        <listheader label="Make" />
        <listheader label="Price" width="20%"/>
        <listheader label="Cool" /> <!-- INSERTED -->
    </listhead>
    <template name="model">
        <listitem>
            <listcell label="@bind(each.model)"></listcell>
            <listcell label="@bind(each.make)"></listcell>
            <listcell>$<label value="@bind(each.price)" /></listcell>
            <listcell><checkbox checked="@bind(each.cool)" /></listcell> <!-- INSERTED -->
        </listitem>
    </template>
</listbox>
<hbox style="margin-top:20px">
     <image width="250px" src="@bind(vm.selectedCar.preview)" /> 
    <vbox>
        <label value="@bind(vm.selectedCar.model)" />
        <label value="@bind(vm.selectedCar.make)" />
        <label value="@bind(vm.selectedCar.price)" />
        <label value="@bind(vm.selectedCar.description)" /> 
        <checkbox checked="@bind(vm.selectedCar.cool)" label="Cool" /> <!-- INSERTED -->
    </vbox>
</hbox>

之后启动Tomcat并在浏览器中输入localhost:8080 / tutorial / searchMvvm.zul。当你点击丰田凯美瑞项目一切都很好,但当你点击日产Cifiro,然后再点击丰田凯美瑞再次在详细视图中的复选框将被取消选中。但是列表框中的复选框工作正常。

您知道解决此问题的任何解决方法吗?

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,但是当我使用getCool()更改isCool()时(在ZK V7上)修复了该问题

答案 1 :(得分:0)

我正在使用ZK7,我遇到了同样的问题。 我得到了:

Property 'standard' not readable on type 
布尔标准上的

,它有getter isStandard和setter setStandard

解决方案是:

  • 使用布尔值(对象)时,必须使用get-Prefix
  • 使用布尔值(基元)时,可以使用is-Prefix

就是这样!

答案 2 :(得分:0)

你应该使用

checkbox.setCheck(Boolean.valueOf(true));