2010-07-21 3 views
0

Моя настройка довольно простая. У меня есть s: List с настраиваемым itemRenderer и dataprovider. Я хотел бы получить доступ к сгенерированным экземплярам средства визуализации элементов, но я понятия не имею, как это сделать.Доступ к itemRenderer экземпляру flash buiilder 4

Вот код для списка:

<s:List id="layersList" 
      borderVisible="false" 
      allowMultipleSelection="true" 
      contentBackgroundAlpha="0" 
      itemRenderer="renderers.LayerRenderer" 
      dataProvider="{AssetsCollection}"> 
    <s:layout> 
    <s:VerticalLayout gap="1" />   
    </s:layout> 
<s:list> 

То, что я хотел бы, чтобы получить доступ к сгенерированным рендерам, как:

layersList.renderers[selectedIndex] or layersList.selectedItems[0].renderer. Для доступа к некоторым из его внутренних объектов. Как и в случае, я хотел бы прослушивать события, отправленные в экземпляре renderer из родителя List.

Может ли кто-нибудь помочь?

+0

Можно начинать отвечать на ваш вопрос и начинать писать о методах ClassFactory и т. Д. Но я думаю, было бы лучше, если бы вы разместили какой-то код, чтобы дать четкое представление о том, что вы пытаетесь выполнить. –

+0

Я добавил код, спасибо. – Tarek

ответ

1

Концептуальная модель списков/ItemRenderers заключается в том, что они представляют собой элементы в dataProvider. Одна из причин, почему это следует учитывать, заключается в том, что списки перерабатывают свои ItemRenderers, чтобы уменьшить объем памяти. Это означает, что у вас может быть 100 элементов в вашем dataProvider, но только небольшая часть из них будет иметь связанные с ними ItemRenderers, и некоторые из них могут даже не отображаться на экране или даже действительны дольше. Есть несколько способов, с помощью которых ваш ItemRenderers в вашем списке отражает состояние родителя List без прямого манипулирования рендерерами. Например, вы можете сделать что-то вроде этого:

<s:List id="layersList" 
     borderVisible="false" 
     allowMultipleSelection="true" 
     dataProvider="{AssetsCollection}" 
     contentBackgroundAlpha="0"> 
    <s:layout> 
     <s:VerticalLayout gap="1" />  
    </s:layout> 
    <s:itemRenderer> 
     <fx:Component> 
      <myrenderers:TestRenderer myState="{outerDocument.someState}"/> 
     </fx:Component> 
    </s:itemRenderer> 
</s:List> 

Где TestRenderer имеет связующее общедоступное свойство myState. И родитель списка имеет свойство bindable, называемое «someState». Затем внутри вашего рендерера вы можете установить некоторую условную логику, основанную на значении myState. Надеюсь, это поможет.

+0

Не совсем тот ответ, на который я надеялся. Но, по крайней мере, я понимаю, почему так благодарен Уэйду. – Tarek

+0

Просто задайте небольшой вопрос. Разве рендер не перерабатывается, только если включен виртуальный макет? – Tarek

+0

Хорошая точка, useVirtualLayout по умолчанию имеет значение true. Вы можете отключить это, но работать непосредственно с рендерерами не рекомендуется, и мой опыт работы с этим в лучшем случае был проблематичным. –

Смежные вопросы