Search code examples
apache-flexactionscript-3comboboxmxmlitemrenderer

Flex custom item renderer for the displayed item in the combobox


I am using a custom item renderer in a combobox to display a custom drawing instead of the default text label.

This works fine for the dropdown list but the displayed item ( when the list is closed) is still the textual representation of my object.

Is there a way to have the displayed item rendered the same way as the one in the dropdown?


Solution

  • By default you cannot do this. However, if you extend ComboBox you can add this functionality easily. Here is a quick example, it is a rough version and probably needs testing / tweaking but it shows how you could accomplish this.

    package
    {
        import mx.controls.ComboBox;
        import mx.core.UIComponent;
    
        public class ComboBox2 extends ComboBox
        {
            public function ComboBox2()
            {
                super();
            }
    
            protected var textInputReplacement:UIComponent;
    
            override protected function createChildren():void {
                super.createChildren();
    
                if ( !textInputReplacement ) {
                    if ( itemRenderer != null ) {
                        //remove the default textInput
                        removeChild(textInput);
    
                        //create a new itemRenderer to use in place of the text input
                        textInputReplacement = itemRenderer.newInstance();
                        addChild(textInputReplacement);
                    }
                }
            }
    
            override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
                super.updateDisplayList(unscaledWidth, unscaledHeight);
    
                if ( textInputReplacement ) {
                    textInputReplacement.width = unscaledWidth;
                    textInputReplacement.height = unscaledHeight;
                }
            }
        }
    }