2011-07-13 7 views
2

В Flex 3 ранее было возможно связать свойство компонента в itemRenderer с помощью внешнего документа. Так, например, если был образ внутри ItemRenderer, который отображается только на заданном состоянии родителя, то, как это будет работать отлично:Adobe Flex 4.5 Искра: связывание компонента ItemRenderer с родителем

<mx:itemRenderer> 
<mx:Component> 
    <mx:Label text="{data}"/> 
    <mx:Image id="img" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/> 
</mx:Component> 
</mx:itemRenderer> 

, где внешний документ (не список, но MXML список в) содержит что-то вроде

[Bindable] 
public function get ShowImage():void 
{ 
return showImage; 
} 
public function set ShowImage(val:Boolean):void 
{ 
showImage = val; 
} 

Я попытался сделать то же самое в Flex 4.5, используя Спарк визуализации элементов с использованием parentDocument, но это не кажется, чтобы быть в курсе к связыванию. Когда я делаю это в Flex 4.5, itemRenderer, похоже, не знает, когда изменяется parentDocument ShowImage.

Кто-нибудь видел эту проблему и может предложить решение?

EDIT: Добавить искровой источник В соответствии с просьбой вот мой искры источник:

MyItemRenderer.mxml

<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx"> 
<s:Label id="myLabel" text="{data}/> 
<s:Image src="something.png" visible="{parentDocument.ShowImage}" includeInLayout="{parentDocument.ShowImage}"/> 
</s:ItemRenderer> 

RendererContainer.mxml

<s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx"> 
<fx:Script> 
<![CDATA[ 

private var showImage:Boolean = false; 

[Bindable] 
public function set ShowImage(val:Boolean):void 
{ 
    showImage = val; 
} 
public function get ShowImage():Boolean 
{ 
    return showImage; 
} 
]]> 
    </fx:Script> 
    <!-- Content Group --> 
    <s:List id="lstCell" width="100%" height="100%" itemRenderer="MyItemRenderer">  
    </s:List> 
</s:Panel> 

ИТАК есть флажок в wrapper вне RendererContainer.mxml, который отправляет настраиваемое событие, которое обрабатывается путем изменения Bindable Boolean. Изменение этого var затем изменяет свойство ShowImage на моем компоненте RendererContainer. Я ожидал бы, что привязка тогда будет получена MyItemRenderer, но она, похоже, не работает.

Так что мой внешний обертка доступ будет ShowImage как этот

<comp:RendererContainer id="myId" ShowImage="{myCheckbox.selected}"/> 
+0

Показать код для 4.5. Например, –

+0

Как правило, для создания чего-то Bindable вам нужно указать событие в теге Bindable Metadata и отправить это событие из метода set. Тем не менее, вы получаете ошибки? ИЛИ значение в itemRenderer просто не меняется? – JeffryHouser

+0

Нет ошибок. ItemRenderer просто не обновляется. В принципе, у меня есть «панель управления», которая содержит опции для того, что может отображаться внутри itemRenderer. Панель управления имеет флажок, который отправляет событие при изменении значения.Обработчик для этого события обновляет свойство ShowImage (которое помечено как Bindable), но когда я переключаю флажок, я просто не вижу, как изображения появляются или исчезают в itemrenderer. Я отправил код для 4.5 – Shawn

ответ

1

Ваш добытчик, похоже, имеет возвращаемый тип недействительным. Изменить что булевы

[Bindable] 
public function get ShowImage():Boolean 
{ 
return showImage; 
} 
public function set ShowImage(val:Boolean):void 
{ 
showImage = val; 
} 
+1

Если бы это было на самом деле, я думаю, что будет ошибка времени компиляции. –

+1

+1 для улова. Я не уверен, что это «реальная» проблема кода или ошибка вырезания и вставки из исходного плаката. – JeffryHouser

+0

+1 @Ranhiru - да, вы получите ошибку компилятора для void на getter :) – Nate

1

Я думаю, что это следует сделать трюк для вас, YourTypeHere будет класс, содержащего объекта, убедитесь, что ShowImage свойство является публичным и Привязываемым.

<mx:itemRenderer> 
    <mx:Component> 
    <mx:Script> 
     <![CDATA[ 
      import YourTypeHere; 
     ]]> 
    </mx:Script> 
     <mx:Label text="{data}"/> 
     <mx:Image id="img" 
     visible="{YourTypeHere(this.parent.ShowImage)}" 
     includeInLayout="{YourTypeHere(this.parent.ShowImage)}"/> 
    </mx:Component> 
</mx:itemRenderer> 

P.s. пожалуйста, не назовите свойства со стартовой буквой в верхнем регистре, включая геттеры, подумайте об этом showImage и о своем частном var чего-то вроде _showImage: D

+0

Это ничего не делает. У меня это работает в Flex 3. Идея состоит в том, чтобы получить привязку к работе в 4.5 искрах. – Shawn

1

Это поможет.

<s:Image src="something.png" visible="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}" includeInLayout="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}"/> 
+0

Извините, это не помогло. – Shawn

+1

Странно. Использовал ваши источники, и это сработало для меня. Во всяком случае, попробуйте просмотреть отладочную версию parentDocument. Ваша привязка не работает, потому что parentDocument не является RendererContainer, а flex не исключает исключения при использовании привязки в mxml. – grass

1

После отлично работает:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <s:layout> 
     <s:VerticalLayout/> 
    </s:layout> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 
     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <s:Panel xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx"> 
     <s:layout> 
      <s:VerticalLayout/> 
     </s:layout> 
     <fx:Script> 
      <![CDATA[ 

       private var showImage:Boolean = false; 

       [Bindable] 
       public function set ShowImage(val:Boolean):void 
       { 
        showImage = val; 
       } 
       public function get ShowImage():Boolean 
       { 
        return showImage; 
       } 
      ]]> 
     </fx:Script> 
     <s:CheckBox label="Select" change="{ShowImage = !ShowImage}"/> 
     <!-- Content Group --> 
     <s:List id="lstCell" width="100%" height="100%" dataProvider="{new ArrayCollection(['A','B'])}"> 
      <s:itemRenderer> 
       <fx:Component> 
        <s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
            xmlns:s="library://ns.adobe.com/flex/spark" 
            xmlns:mx="library://ns.adobe.com/flex/mx" 
            autoDrawBackground="true"> 
         <s:layout> 
          <s:HorizontalLayout/> 
         </s:layout> 
         <s:Label id="myLabel" text="{data}"/> 
         <s:Button label="something.png" visible="{outerDocument.ShowImage}" includeInLayout="{outerDocument.ShowImage}"/> 
        </s:ItemRenderer> 
       </fx:Component> 
      </s:itemRenderer> 
     </s:List> 
    </s:Panel> 

</s:WindowedApplication> 
+0

К сожалению, как показано выше, itemrenderer находится в отдельном классе, а не в строке, поэтому это не работает. – Shawn

+0

Я проверил это снова, чтобы убедиться, что я ничего не пропустил, и привязка все еще не происходила. Спасибо за вашу помощь. – Shawn

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

  • Нет связанных вопросов^_^