通过设置 setComplete(boolean) 控制 Wicket 向导的流程

Control Wicket wizard's flow by setting setComplete(boolean)

嘿,我仍在尝试改进自定义 Wicket 向导以显示具有以下状态的步骤:活动、完成、待定。因此 isCompleted(); 的信息应该 return 正确的值。参考一个isComplete(); return是真的,如果向导可以进行下一步。
我怎样才能操纵这些信息来充分利用我的草稿?例如。在一个 WizardStep 中,我有多个输入字段。

super(new ResourceModel("daten.title"), new ResourceModel("daten.summary"));
java.util.Collections.addAll(sprachen, "Deutsch","English","Français","Italiano");

add(name = new RequiredTextField<String>("name", Model.of("")));
add(vorname = new RequiredTextField<String>("vorname",  Model.of("")));
add(strasse = new RequiredTextField<String>("strasse",  Model.of("")));
add(ort = new RequiredTextField<String>("ort",  Model.of("")));
...

我不希望 "be completed" 的步骤直到每个字段都填写完毕。要检查条件,我必须向每个组件添加一个 AjaxListener 并检查它的状态是否为 setComplete(boolean);
我可以从向导表单外部控制此流程吗?例如,使用 ICondition 的实现还是有其他方法?因为基本上我无法进入下一步,因为我所有的文本字段都是RequiredTextField并且不能跳过
非常感谢任何建议。

更新/解决方案

Component buttonbar = getForm().get(Wizard.BUTTONS_ID);
buttonbar.setOutputMarkupId(true);

只是 get(Wizard.BUTTONS_ID); 不行。 感谢 Sven Meier 的提示!

您必须向所有表单组件添加 AjaxFormComponentUpdatingBehavior。

然后在您的向导中覆盖#onEvent():

public MyWizard(id, WizardModel model) {
    super(id, model);

    get(Wizard.BUTTONS_ID).setOutputMarkupId(true);
}

public void onEvent(IEvent<?> event) {
    if (event.getPayload() instanceof AjaxRequestTarget) {
         ((AjaxRequestTarget)event.getPayload()).add(get(Wizard.BUTTONS_ID));
    }
}

让你的 step#isComplete() return 根据其模型值为真,这样向导按钮将始终是最新的。