Flex 3.5.0; Обновление списка отображения ComboBox при изменении поставщика данных
У меня есть два связанных ComboBox (континенты и страны). Когда континенты ComboBox меняются, я запрашиваю XML с определенного URL. Когда я получаю этот XML, я меняю DataProvider для стран ComboBox, например так:
public function displayCountryArray( items:XMLList ):void
{
this.resellersCountryLoader.alpha = 0;
this.resellersCountry.dataProvider = items;
this.resellersCountry.dispatchEvent( new ListEvent( ListEvent.CHANGE ) );
}
Я отправляю ListEvent.CHANGE, потому что я использую его для изменения другого ComboBox, поэтому, пожалуйста, игнорируйте это (и 1-ю строку).
Итак, моя проблема заключается в следующем: я выбираю "АЗИЯ" на первых континентах, затем обновляется комбинированный список данных (я вижу это, потому что первый ПУНКТ - это элемент с меткой "23 страны"). Я нажимаю комбо, затем я вижу страны.
СЕЙЧАС я выбираю "Африка", отображается первый элемент с закрываемым ComboBox, затем, когда я щелкаю по нему, все еще остаются страны из Азии. В любом случае, если я щелкну элемент в списке, то список обновится правильно, а также у него будет правильная информация (как я уже говорил, это влияет на другие поля со списком). Так что единственная проблема в том, что список отображения не обновляется.
В этой функции я попробовал эти подходы
Преобразование XMLList в XMLCollection и даже ArrayCollection
Добавление this.resellersCountry.invalidateDisplayList();
Инициирующие события, такие как DATA_CHANGE и UPDATE_COMPLETE. Я знаю, что они не имеют особого смысла, но я немного отчаялся.
Обратите внимание, что когда я использовал 3.0.0 SDK, этого не произошло.
Извините, если я глуп, но гибкие события убивают меня.
4 ответа
Установка поставщика данных в раскрывающемся списке comboBox, кажется, решает эту проблему.
this.resellersCountry.dataProvider = items;
this.resellersCountry.dropdown.dataProvider = items;
this.resellersCountry.dropdown.dataProvider = items;
работает (Flex SDK 3.5)
Надеюсь, что эта ошибка исправлена в 4.0
В дополнение к ответу Кристофа:
Когда вы используете привязку данных в вашем ComboBox, вам нужно использовать BindingUtils, чтобы установить выпадающий поставщик данных:
MXML:
<mx:ComboBox id="cb_fontFamily"
width="100%"
dataProvider="{ model.fontFamilies }" />
Автор сценария:
private function init():void
{
BindingUtils.bindSetter(updateFontFamilies, model, "fontFamilies");
}
private function updateFontFamilies(fontFamilies:ArrayCollection):void
{
if (cb_fontFamily != null) cb_fontFamily.dropdown.dataProvider = fontFamilies;
}
Спасибо Кристофу за указание в правильном направлении.
Другой обходной путь, описанный в сообщении на форуме сообщества Adobe, состоит в том, чтобы избежать переназначения другого ArrayCollection
возьмите объект ComboBox и вместо этого повторно используйте (и заново заполняете) исходный:
items.removeAll();
for each (var item:* in newItems)
{
items.addItem(item);
}