Flex 4: скины ArrayCollection как поставщик данных для ItemRenderer списка - PullRequest
0 голосов
/ 04 мая 2011

Цель: Я хотел бы передать скины itemRenderer (который является кнопкой) списка и иметь возможность обрабатывать каждую кнопку в этом списке.

Вот чтоУ меня есть:

Список:

<s:List itemRenderer="renderers.ItemRenderer" dataProvider="{collectionWorkspace}" />

ArrayCollection:

<s:ArrayCollection id="collectionWorkspace">
    <comp:Layout1 />
    <comp:Layout2 />
    <comp:Layout3 />
    <comp:Layout4 />
    <comp:Layout5 />
</s:ArrayCollection>

Макеты являются классами скинов с HostComponentКнопка.

ItemRenderer:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:mx="library://ns.adobe.com/flex/halo"
                xmlns:s="library://ns.adobe.com/flex/spark">

    <s:states>
        <s:State name="normal" />
    </s:states>

    <s:Button skinClass="{data}"/>

</s:ItemRenderer>

Я получаю ошибку (исправлено для уточнения): Ошибка: Скин для приложения ....Кнопка 1 не найдена.

1 Ответ

2 голосов
/ 04 мая 2011

Вы передаете свойству skinClass экземпляр класса скина, а не фактический класс (который необходим кнопке для создания собственного экземпляра класса скина).

Если вы можете, лучше всего сделать collectionWorkspace массивом объектов класса, а не экземпляров.

<s:ArrayCollection id="collectionWorkspace">
    <fx:Class>yourPkg.Layout1</fx:Class>
    <fx:Class>yourPkg.Layout2</fx:Class>
    <fx:Class>yourPkg.Layout3</fx:Class>
    <fx:Class>yourPkg.Layout4</fx:Class>
    <fx:Class>yourPkg.Layout5</fx:Class>
</s:ArrayCollection>

Если вы не можете этого сделать,у вас должна быть возможность вытащить класс экземпляра и передать его skinClass.

<s:Button skinClass="{Object(data).constructor}"/>

РЕДАКТИРОВАТЬ:

Привязка по умолчанию выиграла 't работает, потому что data начинается с null до того, как инициализируется с классом.Если вы дадите ему null, вы получите исключение.Чтобы это исправить, вам нужно будет вернуть значение по умолчанию для времени между null и значением:

<s:Button skinClass="{data != null ? data as Class : spark.skins.spark.ButtonSkin}"/>

Я пытался сделать это с ArrayCollection, используя некоторые скины кнопок.Это сработало.

...