Wicket DropDownChoice возвращает целое число из значения

Здесь вы видите рабочий пример калитки DropDownChoice, но это не то, что я хотел бы иметь. Возвращаемое значение выпадающего выбора должно быть целым числом, совпадающим со значением. Возвращаемое значение выпадающего выбора:

returnedLabel=123 (String)
returnedDDCValue=LabelValue [label=TestB, value=3] (LabelValue)

Для производства returnedDDCValue должно быть целым числом, заполненным (целое число) 3. Я думаю, что внутри ddc должно быть выполнено преобразование. Я пробовал с IChoiceRenderer, но не удалось. Плз помогите:)

ура

Крис

public class DDCTest extends Panel {

    private List<LabelValue> list4ddc;

    public DDCTest(String id) {
        super(id);
        Result result = new Result();

        final FeedbackPanel feedback = new FeedbackPanel("feedback");
        feedback.setOutputMarkupId(true);
        add(feedback);

        this.list4ddc = new ArrayList<LabelValue>();
        this.list4ddc.add(new LabelValue("TestA", 1));
        this.list4ddc.add(new LabelValue("TestB", 3));
        this.list4ddc.add(new LabelValue("TestC", 5));
        this.list4ddc.add(new LabelValue("TestD", 7));

        Form form = new Form("form");
        add(form);

        form.add(new TextField<String>("returnedLabel", new PropertyModel<String>(result,"returnedLabel")));

        form.add( new DropDownChoice("returnedDDCValue", new PropertyModel(result,"returnedDDCValue"), Model.of(list4ddc), new ChoiceRenderer("label", "value")));

        form.add(new AjaxButton("submit", form) {
            @Override
            protected void onSubmit(AjaxRequestTarget target) {
                info("["+result.toString()+"]");
                target.add(feedback);
            }
        });

    }

    public class Result implements Serializable {
        private String returnedLabel;
        private String returnedDDCValue;

        public Result() {
            super();
            this.returnedLabel = "";
            this.returnedDDCValue = null;
        }

        [ ... Getters and setters ... ]

    }

    public class LabelValue implements Serializable {
        private String label;
        private Integer value;

        public LabelValue(String label, Integer value) {
            super();
            this.label = label;
            this.value = value;
        }

        [ ... Getters and setters ... ]
    }
}

1 ответ

Я думаю, что я сделал что-то очень похожее на то, что вам нужно. Это пользовательский DDC, который использует значение выбора для установки третьей модели:

public class DropDownChoiceForString<T> extends DropDownChoice<T> {

private IModel<String> targetModel;

public DropDownChoiceForString(String id, IModel<T> model, IModel<String> targetModel, 
        List<? extends T> choices,
        IChoiceRenderer<? super T> renderer) {
    super(id, model, choices, renderer);
    this.targetModel = targetModel;
}

protected DropDownChoiceForString(String id, IModel<T> model, IModel<String> targetModel) {
    this(id, model, targetModel, Collections.<T> emptyList(), null);
}

@Override
protected void onInitialize() {
    super.onInitialize();
    // load the initial choice.
    setModelObject(convertChoiceIdToChoice(targetModel.getObject()));
}

@Override
protected void onDetach() {
    super.onDetach();

    targetModel.detach();
}

@Override
protected void onModelChanged() {
    super.onModelChanged();

    T newSelection = getModelObject();

    int choiceIndex = getChoices().indexOf(newSelection);
    // update the string source with the selected value.
    targetModel.setObject(getChoiceRenderer().getIdValue(newSelection, choiceIndex));
}}

Он работает как стандартный DDC, но когда его модель изменяется, целевая модель обновляется со значением нового выбора.

Другие вопросы по тегам