Wicket - 如何在自定义表单组件中使用ListView?

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

标签: listview wicket wicket-1.6

我正在尝试实现一个包含ListView的自定义表单组件。

我的自定义表单组件:

public class NotificationDataListPanel extends FormComponentPanel {

    private ListView<NotificationDataBean> listView = null;

    public NotificationDataListPanel(String id) {
        this(id, null);
    }

    public NotificationDataListPanel(String id, List list) {
        super(id);

        listView = new ListView<NotificationDataBean>("listView") {
            @Override
            protected void populateItem(final ListItem<NotificationDataBean> item) {
                final NotificationDataPanel dataPanel = new NotificationDataPanel("dataPanel", new Model<NotificationDataBean>() {
                    @Override
                    public NotificationDataBean getObject() {
                        return item.getModel().getObject();
                    }

                    @Override
                    public void setObject(final NotificationDataBean value) {
                        item.setModelObject(value);
                    }
                });
                item.add(dataPanel);
            }
        };
        add(listView);

        add(new AjaxLink("addNewNDPanel") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                List<NotificationDataBean> modelObject = listView.getModelObject();
                if (modelObject == null) {
                    modelObject = new ArrayList<NotificationDataBean>();
                }
                modelObject.add(new NotificationDataBean());
                listView.setModelObject(modelObject);

                target.add(this);
            }
        });
    }

    @Override
    protected void onBeforeRender() {
        super.onBeforeRender();
        List<NotificationDataBean> modelObject = (List<NotificationDataBean>) getModelObject();
        if (modelObject != null && !modelObject.isEmpty()) {
            listView.setModelObject(modelObject);
        } else {
            listView.setModel(new Model());
        }
    }

    @Override
    protected void convertInput() {
        List<NotificationDataBean> modelObject = listView.getModelObject();

        setConvertedInput(modelObject);
        updateModel();
    }
}

NotificationDataPanel本身在表单方面效果很好,另一方面,我可以在ListView表单中使用它(不是在单独的表单组件中)。

正常工作:

    final Form form = new Form("form", new CompoundPropertyModel(testFormBean));

    final ListView<NotificationDataBean> strs = new ListView<NotificationDataBean>("notiL") {
        @Override
        protected void populateItem(final ListItem<NotificationDataBean> item) {
            final NotificationDataPanel quxField = new NotificationDataPanel("str", new Model<NotificationDataBean>() {
                @Override
                public NotificationDataBean getObject() {
                    return item.getModel().getObject();
                }

                @Override
                public void setObject(final NotificationDataBean value) {
                    item.setModelObject(value);
                }
            });
            item.add(quxField);
        }
    };
    form.add(strs);

但是当我尝试在ListView中使用分隔形式的组件时,我得到了这个例外。

Last cause: No get method defined for class: class TestFormBean expression: listView

不行

    final Form form = new Form("form", new CompoundPropertyModel(testFormBean));
    form.add(new NotificationDataListPanel("notiL"));

TestFormBean课程:

class TestFormBean implements Serializable {
    List<NotificationDataBean> notiL;
}

异常中的 listView 一词指的是ListView中的NotificationDataListPanel ID。

提前感谢您提供有关如何解决此问题的任何提示,请接受我对我糟糕英语的道歉。

1 个答案:

答案 0 :(得分:2)

您没有为Lis​​tView提供模型,因此它将在组件层次结构中搜索一个模型。 CompountPropertyModel为子组件提供模型,并使用它们的id在模型上查找属性。

您可能只想这样做:

new ListView<NotificationDataBean>("listView", list);