Flex AS3 - событие отправки для всех экземпляров ItemRenderer - PullRequest
3 голосов
/ 22 апреля 2009

У меня есть список, который использует пользовательский ItemRenderer. Есть ли способ для владельца (Список) отправить созданное мной пользовательское событие всем экземплярам ItemRenderer?

Например, я хочу отправить событие, которое добавит текст в текстовое поле в средстве визуализации элементов. Один или несколько средств визуализации элементов смогут отвечать на это событие в зависимости от определенных действий пользователя.

Есть ли способ?

Спасибо:)

Ответы [ 2 ]

7 голосов
/ 22 апреля 2009

Если ваши пользовательские экземпляры ItemRenderer каким-то образом имеют доступ к экземпляру List, это просто - просто зарегистрируйте свой метод обработки событий:

theList.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);

Если у вас нет прямого доступа (что я предполагаю), вы все равно можете сделать это косвенно, например, через делегата объекта класса ItemRenderer. Сделайте экземпляр подкласса EventDispatcher статическим свойством класса ItemRenderer, а в конструкторе ItemRenderer зарегистрируйте с ним обработчик событий:

public class ItemRenderer {
    public static var eventDelegate:YourCustomEventDispatcher;

    public function ItemRenderer() {
        eventDelegate.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);
        (...)
    }

    public function itemRendererCustomHander(event:YourCustomEvent) {
        (...)
    }
}

Теперь, когда вы создаете список (либо в ActionScript, либо в обработчике события инициализации вашего компонента MXML), создаете новый YourCustomEventDispatcher, присваиваете ему ссылку на список и добавляете его в ItemRenderer. YourCustomEventDispatcher регистрирует закрытый обработчик событий для YourCustomEvent с помощью theList и просто повторно отправляет его. Поскольку все экземпляры ItemRenderer, в свою очередь, зарегистрировались для YourCustomEvent с YourCustomEventDispatcher, YourCustomEvent theLists достигает всех ItemRenderers через один переход.

Это в основном реализация шаблона проектирования Observer.

3 голосов
/ 22 апреля 2009

Чтобы получить доступ к экземпляру List и добавить прослушиватель событий, ваш рендерер может реализовать интерфейс IDropInListItemRenderer.

Затем вы будете вынуждены реализовать методы get listData и установить методы listData, определенные интерфейсом. Этот метод будет автоматически вызываться платформой, когда ваши экземпляры класса рендеринга требуются для визуализации нового элемента, а set listData предоставит вам объект BaseListData с некоторой полезной информацией.

public function set listData(listData:BaseListData):void {
  var list:UIComponent = listData.owner; // the list component instance
  list.addEventListener(YourCustomEvent.CUSTOM_EVENT, itemRendererCustomHander);
}

Обратите внимание, что при использовании более сложных основанных на списке компонентов (таких как DataGrid, AdvancedDataGrid и TreeList, вы можете безопасно преобразовать объект BaseListData в более конкретные классы (DataGridListData, TreeListData, ...), чтобы получить доступ к набору другая информация о контексте, в котором используется этот экземпляр средства визуализации элементов (например, какой столбец DataGrid он будет отображать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...