Как настроить ширину ComboBox Flex 3 для изменения содержимого привязанного dataProvider? - PullRequest
1 голос
/ 15 сентября 2009

В Flex 3 я создал ComboBox в компоненте MXML, подобном следующему:

<mx:ComboBox id="comboBox" dataProvider="{_choices}" />

<mx:Script>
<![CDATA[
  import mx.collections.ArrayCollection;
  // etc...
  public function get choices():ArrayCollection { return _choices; }

  [Bindable]
  private var _choices:ArrayCollection =
    new ArrayCollection( [ { data: "ALL", label: "All" } ] );
  // etc...
]]>
</mx:Script>

</mx:HBox>

В родительском приложении MXML я изменяю содержимое свойства choices:

myComponentId.choices.removeAll();
myComponentId.choices.addItem({data: "NY", label: "New York"});
myComponentId.choices.addItem({data: "CA", label: "California"});
// etc...

Привязка - это , работающая в том, что ComboBox автоматически подбирает новое содержимое, добавленное во время выполнения, однако не регулирует свою ширину. Начальная ширина ComboBox достаточно широка, чтобы показать начальный элемент «Все», объявленный в компоненте. Однако я хочу и ожидал, что ComboBox автоматически изменит размеры во время привязки, чтобы иметь возможность отображать «California», но это не так.

Как заставить ComboBox обновлять свою ширину после добавления новых более широких меток в свой dataProvider? Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 сентября 2009

Вам, вероятно, просто нужно позвонить invalidateProperties(), invalidateDisplayList(), invalidateSize() или какой-то комбинации из трех (я сам что-то вроде гибкого новичка), чтобы принудительно обновить измерения компонента после изменения поставщик данных или его содержимое.

myComponentId.invalidateSize();
myComponentId.invalidateDisplayList();
myComponentId.invalidateProperties();
0 голосов
/ 01 июня 2010

Я столкнулся с той же проблемой, и ни один из них не работал для меня. Мне удалось решить эту проблему, создав новый обработчик событий

menuComboBox.addEventListener(ResizeEvent.RESIZE, updateListWidth);

Метод, вызываемый в этом событии, просто изменяет размер свойства dropdown.width.

private function updateListWidth(event:ResizeEvent):void {
        menuComboBox.dropdown.width = menuComboBox.width;
}
0 голосов
/ 15 сентября 2009

Я бы добавил установщик для choices и вызвал бы validateNow() в ComboBox в конце установщика:

public function set choices(value:ArrayCollection):void
{
    _choices = value;

    comboBox.validateNow();
}
...