Flex-Snippet: Combobox-Liste zur Laufzeit aktualisieren

Seit einigen Versionen scheint Adobe ein recht großes Problem nicht zu beheben. Wenn zur Laufzeit einer Combobox ein neuer Wert zugewiesen wird, dann wird dieser auch gespeichert, aber nicht in die Combobox-Dropdown-Liste übernommen. Im Normalfall wird der Inhalt einer Combobox nur einmal gesetzt und wird dann verwendet. Manchmal möchte man aber zum Beispiel mehrere Comboboxen voneinerander abhängig machen.

Das äußert sich darin, dass nur das Textfeld der Combobox stimmt und man bis zum Listen-Click alte Werte in der Liste hat. Da man aber auch nicht einfach die Core-Klassen umschreiben kann (wären bei einem kommenden update wieder weg), muss die Klasse abgeleitet werden.

Hier der Code:

/**
 * @author Christian Mueller
 * @url www.pixeltex.com
 * @date 1/7/2010
 * @description Normally the combobox does not update their dropdownlist. This class replaces this function. Former the list was only switched between on and off.
 *
 */
package com.pixeltex {
    
     import flash.events.Event;
    
     import mx.controls.ComboBox;
     import mx.events.FlexEvent;

     public class ExtendedComboBox extends ComboBox {
         
          private var dropdownCreated : Boolean;
         
          public function ExtendedComboBox() {
               dropdownCreated = false;
               super();
          }
         
          override protected function downArrowButton_buttonDownHandler( event:FlexEvent ):void {
             super.downArrowButton_buttonDownHandler( event );
                
                 // after calling the first time to open dropdown, it must be created
                 dropdownCreated = true;
         }
        
         override protected function updateDisplayList( unscaledWidth:Number, unscaledHeight:Number ):void {
              super.updateDisplayList( unscaledWidth, unscaledHeight );
             
              if ( dropdownCreated ) {
                   if ( dropdown.width != unscaledWidth ) {
                        dropdown.width = unscaledWidth; // new data means new with of list
                   }
              }
         }
        
         override public function set dataProvider(value:Object):void {
              super.dataProvider = value;
             
              if ( dropdownCreated ) { //dropdown will not be created now
                   if ( dataProvider != dropdown.dataProvider ) {
                       dropdown.dataProvider = dataProvider;  // overwrite existing list dataprovider
                  }
              }
         }
        
         override public function get dataProvider():Object {
              return super.dataProvider;
         }
     }
}

Diese Klasse sorgt dafür, dass beim setzen neuer Werte auch die Liste aktualisiert wird. Bei der Prüfung muss man allerdings aufpassen, dass man nicht einfach "dropdown" abfragt, da sonst ungewollt eine neue Liste erstellt wird. Dieses ist problematisch, wenn zum dem Zeitpunkt falsche Position- oder Stylewerte vorhanden sind. Aus diesem Grund gibt es die Variable "dropdownCreated", die nach dem ersten Listenaufruf auf true gesetzt wird.

Ein kleiner spaßiger Auszug aus der Combobox-Klasse:

public function close(trigger:Event = null):void
{
    if (_showingDropdown)
    {
        if (_dropdown && selectedIndex != _dropdown.selectedIndex)
            selectedIndex = _dropdown.selectedIndex;

        displayDropdown(false, trigger);

        dispatchChangeEvent(new Event("dummy"),
                _selectedIndexOnDropdown,
                selectedIndex);
    }
}

Über den Autor

Christian Müller

Christian Müller, Certified Expert Flex with Air Entwickler bei PIXELTEX Berlin

Telefon +49 (0) 30 609 82321 22
E-Mail: christian.mueller@pixeltex.com