Как настроить ширину Flex 3 ComboBox для изменения в зависимости от содержимого привязанного dataProvider?
Во 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 автоматически изменит размеры во время связывания, чтобы иметь возможность отображать "Калифорния", но это не так.
Как я могу заставить ComboBox обновлять его ширину после того, как я добавил новые более широкие метки в его dataProvider? Спасибо!
3 ответа
Вам, вероятно, просто нужно позвонить invalidateProperties()
, invalidateDisplayList()
, invalidateSize()
или какую-то комбинацию из трех (я сам в некотором роде гибкий новичок) для принудительного обновления измерений компонента после изменения поставщика данных или его содержимого.
myComponentId.invalidateSize();
myComponentId.invalidateDisplayList();
myComponentId.invalidateProperties();
Я бы добавил сеттер для choices
и позвонить validateNow()
в поле со списком в конце установщика:
public function set choices(value:ArrayCollection):void
{
_choices = value;
comboBox.validateNow();
}
Я столкнулся с той же проблемой, и ни один из них не работал для меня. Мне удалось решить эту проблему, создав новый обработчик событий
menuComboBox.addEventListener(ResizeEvent.RESIZE, updateListWidth);
Метод, вызываемый в этом событии, просто изменяет размер свойства dropdown.width.
private function updateListWidth(event:ResizeEvent):void {
menuComboBox.dropdown.width = menuComboBox.width;
}