Adobe Flex 4.5 Spark: привязка компонента ItemRenderer к родительскому элементу

Во Flex 3 раньше можно было привязать свойство компонента в itemRenderer через externalDocument. Так, например, если бы внутри 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, используя средства визуализации элементов Spark с помощью parentDocument, но, похоже, он не знает о привязке. Когда я делаю это в Flex 4.5, кажется, что itemRenderer не знает об изменении родительского документа ShowImage.

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

РЕДАКТИРОВАТЬ: Добавить источник искры По запросу вот мой источник искры:

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>

Хорошо, поэтому в оболочке за пределами RendererContainer.mxml есть флажок, который отправляет настраиваемое событие, которое обрабатывается путем изменения Bindable Boolean. Затем изменение этой переменной изменяет свойство ShowImage в моем компоненте RendererContainer. Я бы ожидал, что привязка будет подобрана MyItemRenderer, но, похоже, она не работает.

Итак, моя внешняя оболочка будет обращаться к ShowImage следующим образом

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

person Shawn    schedule 13.07.2011    source источник
comment
Покажите код для примера 4.5.   -  person J_A_X    schedule 13.07.2011
comment
Обычно, чтобы сделать что-то Bindable, вам нужно указать событие в теге Bindable Metadata и отправить это событие из метода set. Тем не менее, вы получаете ошибки? ИЛИ значение в itemRenderer просто не меняется?   -  person JeffryHouser    schedule 13.07.2011
comment
Ошибок нет. ItemRenderer просто не обновляется. По сути, у меня есть панель управления, которая содержит параметры того, что может отображаться в itemRenderer. На панели управления есть только флажок, который отправляет событие при изменении значения. Обработчик этого события обновляет свойство ShowImage (которое помечено как Bindable), но когда я переключаю флажок, я просто не вижу, чтобы изображения появлялись или исчезали в средстве визуализации элементов. Я отправлю код для 4.5   -  person Shawn    schedule 14.07.2011


Ответы (4)


Я думаю, это должно помочь вам, 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 и вашу частную переменную как-то вроде _showImage: D

person Nate    schedule 13.07.2011
comment
Это ничего не делает. У меня это работает в Flex 3. Идея состоит в том, чтобы заставить работать привязку в 4.5 spark. - person Shawn; 14.07.2011

Кажется, ваш получатель имеет возвращаемый тип как void. Измените это на Boolean

[Bindable]
public function get ShowImage():Boolean
{
return showImage;
}
public function set ShowImage(val:Boolean):void
{
showImage = val;
}
person Nikhil    schedule 13.07.2011
comment
Если бы это было на самом деле, я думаю, была бы ошибка времени компиляции. - person Ranhiru Jude Cooray; 13.07.2011
comment
+1 за улов. Однако я не уверен, настоящая ли это проблема с кодом или ошибка вырезания и вставки исходного плаката. - person JeffryHouser; 13.07.2011
comment
+1 @Ranhiru - да, вы бы получили ошибку компилятора для void на геттере :) - person Nate; 14.07.2011

Это поможет.

<s:Image src="something.png" visible="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}" includeInLayout="{RendererContainer(ListSkin(parentDocument).parentDocument).ShowImage}"/>
person grass    schedule 18.07.2011
comment
Странный. Использовал ваши источники, и у меня это сработало. В любом случае, попробуйте просмотреть отладку, что такое parentDocument. Ваша привязка не работает, потому что parentDocument не является RendererContainer, а flex не генерирует исключения при использовании привязки в mxml. - person grass; 27.07.2011

Следующее работает отлично:

<?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>
person M.D.    schedule 18.07.2011
comment
К сожалению, как показано выше, средство визуализации предметов находится в отдельном классе, а не встроено, поэтому это не работает. - person Shawn; 20.07.2011
comment
Я протестировал это еще раз, чтобы убедиться, что я что-то не пропустил, и привязка все еще не происходила. Спасибо за вашу помощь. - person Shawn; 20.07.2011