Гибкий вариант 4: использует ArrayCollection как средство предоставления данных для элемента, отображающего список

#apache-flex #itemrenderer #skin #arraycollection

#apache-flex #itemrenderer #Кожа #arraycollection

Вопрос:

Цель: Я хотел бы передать скины в 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>
  

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

Ответ №1:

Вы передаете 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}"/>
  

Редактировать:

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

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

Я пытался сделать это с ArrayCollection использованием некоторых оболочек кнопок. Это сработало.

Комментарии:

1. Отредактированное значение skinClass кнопки сработало для меня хорошо! Спасибо, Брайан. Я надеюсь, что другие также найдут в этом ценность.