2

フォームに、特定の属性の別のタイプを持つ Model が添付された CompoundPropertyModel がある場合、Wicket の方法で、選択した DropDownChoices 値を変換することは可能ですか?

私の説明はあまり正確ではないと思うので、簡単な例:

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 コンポーネントに名前を付けて、送信後にその値をモデルにコピーできることを知っています。しかし、それはウィケッツ モデルのアプローチではありませんね。

Ps: 私は Wicket 6.17.0 を使用しています。

4

1 に答える 1

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());
      }
    };
  }
);
于 2015-01-29T21:00:17.653 に答える