Thanks Andrea,

I was trying what you sent in your previous  message and I was having
trouble figuring out how to get the value set on the target property model.

Your code here, especially this line:

        targetModel.setObject(getChoiceRenderer().getIdValue(newSelection,
choiceIndex));

was really helpful and I was able to get everything working.

Thanks again. 
Have you ever consider making this available to the Wicket community? I see
a lot of questions related to DropDownChoice, but not many answers.

- Bruce


-----Original Message-----
From: Andrea Del Bene [mailto:an.delb...@gmail.com] 
Sent: Wednesday, February 12, 2014 4:31 AM
To: users@wicket.apache.org
Subject: Re: How to make a Wiket DropDownChoice with complex a model return
a simple String

Here is some code of a possible solution:


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));
    }
}



> Hi,
>
> I needed something similar in a couple of projects. One solution is to 
> create a custom DropDownChoice which takes also the string model to 
> update. Then you can override onModelChanged to update the string 
> model with the new value that can be extracted with the ChoiceRenderer.
>> To make this easier to understand, let's say that I have a list of 
>> state abbreviations for example AL, AK, AZ, AR etcetera (the actual 
>> example has two letter abbreviations also, but much longer names). I 
>> need a DropDownChoice that shows the abbreviations for selection 
>> (e.g., AK) but will show the full name as a tooltip whenever the 
>> mouse hovers over one of the choice (e.g., AK shows Alaska).
>>
>>  
>> I have developed a solution that is based on the example presented here:
>> http://stackoverflow.com/questions/12234738/wicket-dropdownchoice-tit
>> les-too
>>
>> ltips-for-options
>>
>> that develops a subclass of DropDownChoice and overrides 
>> appendOptionHtml to append a "title" to the buffer. My class takes a 
>> StateDisplay object as its model, and the model has two fields, an 
>> "id" that is displayed in the list, and a "fullName" which is added 
>> as the title by the appendOptionHtml method.
>>
>>  
>> This works fine for displaying thedropdown with the  tooltip, but the 
>> problem is that the model is a complex object( StateDisplay) with two 
>> fields, but the underlying domain object needs a simple String with 
>> the state ID.
>>
>>  
>> Prior to implementing the tooltip, the DrowdownChoice was formed using:
>>
>>  
>> Item.add(new DropDownChoice<String>("state", new
>> PropertyModel<String>((CompanyDTO) item.getDefaultModelObject(), 
>> "state"), stateList)));
>>
>>  
>> Note: "item "is there because this is used in the populateItem method 
>> of a ListView.
>>
>>  
>> Now the code is:
>>
>>  
>> Model< StateDisplay > selectedState = new Model<>();
>>
>>  
>> ChoiceRenderer<StateDisplay> choiceRenderer = new 
>> ChoiceRenderer<ModifierDisplayDto>("id", "id");
>>
>>                            
>> Item.add(new StateDropDownChoice< StateDisplay >("state", 
>> selectedState, stateList, choiceRenderer));
>>
>>  
>> After the selection is made the model (selectedState) is set to the 
>> chosen StateDisplay, but there is no easy way to the simple String 
>> value set on the CompanyDTO.
>>
>>  
>> How can I make the dropdown selection update the domain model's 
>> simple String.
>>
>>  
>> Thanks
>>
>> Bruce
>>
>>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
For additional commands, e-mail: users-h...@wicket.apache.org

Reply via email to