Wicket-DropDownChoice POJO到属性模型

Wicket-DropDownChoice POJO到属性模型,wicket,dropdownchoice,Wicket,Dropdownchoice,下拉选择有点问题。 我用对象列表构建了一个下拉选项。 例如: public MyClass private String code; private String description; [...] 而不是拿另一件东西 public FormModelObject private String code; 我可以使用ChoiceRender轻松构建下拉选择,选择显示内容(描述属性)和获取内容(代码属性) 不幸的是,DropDownChoice返回整个对象(MyClass),

下拉选择有点问题。 我用对象列表构建了一个下拉选项。 例如:

public MyClass 
  private String code;
  private String description;
[...]
而不是拿另一件东西

public FormModelObject
   private String code;
我可以使用ChoiceRender轻松构建下拉选择,选择显示内容(描述属性)和获取内容(代码属性)

不幸的是,DropDownChoice返回整个对象(MyClass),我无法在FormModelObject中设置属性代码(它只是在MyClass上启动一个toString()方法)

如果不使用Ajax,如何获得它


谢谢

尝试使用模型链接。您应该使用如下构建的属性模型替换表单的变量代码:

//this is the model of your DropDownChoice
Model<MyClass> myModel = new Model<MyClass>();
//...

PropertModel myCode = new PropertModel(myModel, "code");
//这是您下拉选择的模型
模型myModel=新模型();
//...
PropertModel myCode=新的PropertModel(myModel,“代码”);

现在使用myCode代替表单中的代码。

尝试使用模型链接。您应该使用如下构建的属性模型替换表单的变量代码:

//this is the model of your DropDownChoice
Model<MyClass> myModel = new Model<MyClass>();
//...

PropertModel myCode = new PropertModel(myModel, "code");
//这是您下拉选择的模型
模型myModel=新模型();
//...
PropertModel myCode=新的PropertModel(myModel,“代码”);

现在使用myCode代替表单中的代码。

最好编写一些代码:

    class City {
      private String zipCode;
      private String name;
    }

    class Residence {
      private String residenceZipCode;
    }

protected Residence res;

public ResidenceForm() {
  super("form", new CompoundPropertyModel<Residence>(res));

  List<City> cityList = someManager().loadAllCity();

  DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",cityList,new ChoiceRenderer<City>("name", "zipcode"));
add(drop);
class城市{
私有字符串zipCode;
私有字符串名称;
}
阶级住宅{
私有字符串常驻代码;
}
受保护住宅;
公共住宅形式(){
超级(“形式”,新的复合属性模型(res));
List cityList=someManager().loadAllCity();
DropDownChoice drop=新的DropDownChoice(“居住区代码”、城市列表、新的ChoiceRender(“名称”、“zipcode”);
增加(减少);
现在,我不能改变住所或城市,也不能在Submit button的方法中编写代码


我想要的是住宅内的zipcode。我现在得到的是等效于City.toString()的代码。

最好编写一些代码:

    class City {
      private String zipCode;
      private String name;
    }

    class Residence {
      private String residenceZipCode;
    }

protected Residence res;

public ResidenceForm() {
  super("form", new CompoundPropertyModel<Residence>(res));

  List<City> cityList = someManager().loadAllCity();

  DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",cityList,new ChoiceRenderer<City>("name", "zipcode"));
add(drop);
class城市{
私有字符串zipCode;
私有字符串名称;
}
阶级住宅{
私有字符串常驻代码;
}
受保护住宅;
公共住宅形式(){
超级(“形式”,新的复合属性模型(res));
List cityList=someManager().loadAllCity();
DropDownChoice drop=新的DropDownChoice(“居住区代码”、城市列表、新的ChoiceRender(“名称”、“zipcode”);
增加(减少);
现在,我不能改变住所或城市,也不能在Submit button的方法中编写代码


我想要的是住宅内的zipcode。我现在得到的是等效于City.toString()

嗯,您可以覆盖DropDownChoice的modelChanged()方法,并用新值更新住宅zipcode。类似于:

DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",new Model(), cityList,new ChoiceRenderer<City>("name", "zipcode")){
     onModelChanged(){
       String newZipCode =  (String)PropertyResolver.getValue("zipCode",getModelObject());
       PropertyResolver.setValue("residenceZipCode", res, newZipCode, new  PropertyResolverConverter());
     }

};
dropdownthoice-drop=new-dropdownthoice(“居住区代码”,new-Model(),城市列表,new-choicenderer(“名称”,“zipcode”)){
onModelChanged(){
String newZipCode=(String)PropertyResolver.getValue(“zipCode”,getModelObject());
setValue(“ResideZIPCode”,res,newZipCode,newPropertyResolveConverter());
}
};

DropDownChoice必须有自己的模型。

好的,您可以覆盖DropDownChoice的modelChanged()方法,并用新值更新residenceZipCode。类似于:

DropDownChoice<City> drop = new DropDownChoice<City>("residenceZipCode",new Model(), cityList,new ChoiceRenderer<City>("name", "zipcode")){
     onModelChanged(){
       String newZipCode =  (String)PropertyResolver.getValue("zipCode",getModelObject());
       PropertyResolver.setValue("residenceZipCode", res, newZipCode, new  PropertyResolverConverter());
     }

};
dropdownthoice-drop=new-dropdownthoice(“居住区代码”,new-Model(),城市列表,new-choicenderer(“名称”,“zipcode”)){
onModelChanged(){
String newZipCode=(String)PropertyResolver.getValue(“zipCode”,getModelObject());
setValue(“ResideZIPCode”,res,newZipCode,newPropertyResolveConverter());
}
};

DropDownChoice必须有自己的模型。

看看DDC的类型参数:在您的例子中,它是City,因此DDC可以处理City对象

如果您不希望这样,请更改类型,编译器将指导您:

DropDownChoice<String> drop = new DropDownChoice<String>("residenceZipCode",zipCodesList,new CityChoiceRenderer());

class CityChoiceRenderer implements IChoiceRenderer<String> {
  Object getDisplayValue(String zipCode) {
    return zipCodeToName(zipCode);
  }

  String getIdValue(String zipCode, int index) {
    return zipCode;
  }
}
dropdownthoice-drop=new-dropdownthoice(“派驻代码”,ZipCodes列表,new-cityChoiceRender());
类citychoicenderer实现ICHOicenderer{
对象getDisplayValue(字符串zipCode){
返回zipCodeToName(zipCode);
}
字符串getIdValue(字符串zipCode,int索引){
返回zipCode;
}
}

看看DDC的类型参数:在您的例子中,它是City,因此DDC可以处理City对象

如果您不希望这样,请更改类型,编译器将指导您:

DropDownChoice<String> drop = new DropDownChoice<String>("residenceZipCode",zipCodesList,new CityChoiceRenderer());

class CityChoiceRenderer implements IChoiceRenderer<String> {
  Object getDisplayValue(String zipCode) {
    return zipCodeToName(zipCode);
  }

  String getIdValue(String zipCode, int index) {
    return zipCode;
  }
}
dropdownthoice-drop=new-dropdownthoice(“派驻代码”,ZipCodes列表,new-cityChoiceRender());
类citychoicenderer实现ICHOicenderer{
对象getDisplayValue(字符串zipCode){
返回zipCodeToName(zipCode);
}
字符串getIdValue(字符串zipCode,int索引){
返回zipCode;
}
}

为什么?您有实现IModel的DDC的支持模型,可以简单地从中访问对象和代码属性?为什么?您有实现IModel的DDC的支持模型,可以简单地从中访问对象和代码属性?