2011-07-13 90 views
2

在Flex 3中,它曾經有可能通過outerDocument綁定itemRenderer中的組件屬性。因此,舉例來說,如果有也僅僅父給定的條件下顯示的itemRenderer內的圖像,像這樣的工作完美:Adob​​e Flex 4.5 Spark:綁定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 Spark項呈示,但它似乎並沒有意識到的結合。當我在Flex 4.5中這樣做時,itemRenderer在parentDocument 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布爾值來處理的自定義事件。然後該var中的更改將更改我的RendererContainer組件上的ShowImage屬性。我期望綁定將被MyItemRenderer拾取,但它似乎沒有工作。

所以,我的外包裝紙將訪問ShowImage這樣

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

顯示爲4.5例子中的代碼。 –

+0

正常情況下,您需要在Bindable元數據標籤中指定一個事件並從set方法中分派該事件。這就是說你得到的錯誤?或者itemRenderer中的值只是沒有改變? – JeffryHouser

+0

沒有錯誤。 itemRenderer只是不更新​​。基本上,我有一個「控制面板」,其中包含可在itemRenderer中顯示的選項。控制面板只有一個複選框,當值更改時調度事件。該事件處理程序更新屬性ShowImage(標記爲Bindable),但當我切換複選框時,我根本沒有看到圖像在itemrenderer中出現或消失。我發佈了4.5 – Shawn

回答

1

你消氣似乎已經返回類型爲void。改變布爾

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

的代碼。如果實際上,我認爲會有編譯時錯誤。 –

+1

+1。不過,我不確定這是來自原始海報的「真實」代碼問題還是剪切和粘貼錯誤。 – JeffryHouser

+0

+1 @Ranhiru - 是的,你會得到一個編譯器錯誤的吸氣劑虛空:) – 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.請不要使用起始大寫字母命名屬性,包括getter,請考慮將其命名爲showImage,並將您的私有變量命名爲_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