Идеальное решение - не использовать словарь, но это не отвечает на ваш вопрос ...
Так что, если вы были вынуждены использовать словари, одним из способов решения этой проблемы было бы использованиефункционировать как ваш "средний человек".Он может находиться между вашим словарем и компонентами Flex, которые заботятся о его изменении.
Конечно, с большими словарями это может быть неэффективно, но в большинстве случаев производительность должна быть приемлемой.
Во-первых, вам нужна функция для преобразования из словаря в ArrayCollection.Одного из следующих рабочих примеров может быть достаточно:
Извлечение коллекций ключей / значений из словаря
public function extractKeys(d:Dictionary):ArrayCollection {
var keyList:ArrayCollection = new ArrayCollection();
if(d != null) for(var key:* in d) keyList.addItem(key);
return keyList;
}
public function extractValues(d:Dictionary):ArrayCollection {
var valueList:ArrayCollection = new ArrayCollection();
if(d != null) for each(var value:* in d) valueList.addItem(value);
return valueList;
}
Тогда вы можете сами связываться с этими функциями!Таким образом, каждый раз при изменении базового словаря обновляются любые объекты, зависящие от этих функций.Например:
Привязка к значениям словаря с помощью функции
private var myDictionary:Dictionary; //initialized and used elsewhere
[Bindable(event="dictionaryValueChanged")]
public function extractValues(d:Dictionary):ArrayCollection {
var valueList:ArrayCollection = new ArrayCollection();
if(d != null) for each(var value:* in d) valueList.addItem(value);
return valueList;
}
public function updateDictionary(key:Object, value:Object):void {
myDictionary[key] = value;
dispatchEvent("dictionaryValueChanged");
}
Оттуда вы можете использовать ФУНКЦИЮ в качестве поставщика данных.Как в:
<mx:DataGrid id="valueGrid" dataProvider="{extractValues()}" />
Всякий раз, когда ваш словарь изменяется (через функцию updateDictionary), он в конечном итоге будет запускать обновление в DataGrid!
Это действительно просто приложение очень мощного методав flex: привязка к функциям .Как только вы это освоите, существует множество проблем, которые можно решить с помощью этого подхода.
Я надеюсь, что это кому-нибудь поможет,
-gMale
РЕДАКТИРОВАТЬ:
Мне бы пришлось поиграть с этим, но я думаю, что вы также можете устранить функцию 'updateDictionary', выполнив что-то вроде этого:
[Bindable(event="dictionaryValueChanged")]
private var myDictionary:Dictionary; //initialized and used elsewhere
[Bindable(event="dictionaryValueChanged")]
public function extractValues(d:Dictionary):ArrayCollection {
var valueList:ArrayCollection = new ArrayCollection();
if(d != null) for each(var value:* in d) valueList.addItem(value);
return valueList;
}