将选定的DropDownChoice转换为CompoundPropertyModel中的Model

时间:2015-01-29 11:52:30

标签: java wicket wicket-6

当窗体具有附加了Model的CompoundPropertyModel时,可以以Wicket的方式转换所选的DropDownChoices值,该Model具有特定属性的另一种类型。

简单的例子,因为我猜我的解释不是很准确:

public enum MyChoices {
    ONE(1),TWO(2),THREE(3);
    // ... etc
}

public class MyEntityModel {
    private int number;
    private String text;
}

// the WebPages constructor:
public ChoicePage() {
    IModel<MyEntityModel> model = new CompoundPropertyModel<>(new EntityModel());
    Form<MyEntityModel> form = new Form<MyEntityModel>("form", model);
    add(form);

    form.add(new TextField<String>("text"));
    form.add(new DropDownChoice<>("choices", Model.of(MyChoices.ONE),
             Arrays.asList(MyChoices.values()))

}

提交选择了ONE的表单时,我希望模型对象的值为1

我知道,我可以命名除MyEntityModel字段之外的DropDownChoice组件,并在提交后将其值复制到模型中。但那不是Wickets模式的方法,是吗?

P.s。:我正在使用Wicket 6.17.0

1 个答案:

答案 0 :(得分:1)

您必须进行一些转换。

转换选择列表:

form.add(new DropDownChoice<Integer>("number",
  new AbstractReadOnlyModel<List<Integer>>() {
    public List<Integer> getObject() {
      return MyChoices.getAllAsInts();
    }
  }
);

或所选择的选项:

form.add(new DropDownChoice<MyChoices>("number", Arrays.asList(MyChoices.values()) {
  public IModel<?> initModel() {
    final IModel<Integer> model = (IModel<Integer>)super.initModel();

    return new IModel<MyChoice>() {
      public MyChoice getObject() {
        return MyChoice.fromInt(model.getObject());
      }

      public void setObject(MyChoice myChoice) {
        model.setObject(myChoice.toInt());
      }
    };
  }
);