2012-02-15 35 views
1

我在我的空中應用程序的不同位置使用dropdownlist。 對於這些數據提供程序,始終是一個ArrayCollection,但一些有一個字段,如如何使用不同arraycollection字段的皮膚下拉列表

情況1

var collection:ArrayCollection = new ArrayCollection(["foo", "foo2", "foo3"]); 

而且有時ArrayCollection中的填充與其它方法有幾個領域:

案例2

var collection:ArrayCollection = new ArrayCollection (
       [{DESC:"foo", ID:"0"}, 
       {DESC:"foo1", ID:"1"}, 
       {DESC:"foo2",ID:"2"}, 
       {DESC:"foo3", ID:"3"} 
       ] 
       ); 

在這種情況下,labelField是Desc。

所以,我喜歡定製DDL,和創建一個皮膚itemrender用於標籤部分:

<?xml version="1.0" encoding="utf-8"?> 
<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:states> 
     <s:State name="normal"/> 
     <s:State name="hovered"/> 
     <s:State name="selected"/> 
    </s:states> 
    <s:Label text="{data}" backgroundColor.selected="#1B5790" color.selected="white" 
      backgroundColor.hovered="#E1DFD2" color.hovered="white" fontWeight.hovered="bold" 
      width="100%" height="25" paddingLeft="5" paddingTop="5" styleName="myLabelBlack" toolTip="{data}"/> 

</s:ItemRenderer> 

該方法與實施例1(arListBank),但顯示[對象物體]行之有效與殼體2。

所以我的目標是在這兩種情況下都有相同的itemrenderer。

你能幫我嗎?

感謝

+0

當你提供了很多很好的信息在這裏;你忽略瞭解釋數據對象的結構。沒有這些信息,就不可能幫你寫一個itemRenderer。不管你如何填充dataProvider;它重要的是你實際試圖展示的數據。作爲參考點,我可能不會嘗試使用相同的itemRenderer來顯示兩組不同的數據。 – JeffryHouser 2012-02-15 23:39:50

+0

+1的編輯,我相信讓你的帖子無限多的支持。 – JeffryHouser 2012-02-16 04:53:28

回答

0

有改變了渲染「意見」 HERE
請務必閱讀評論一個很好的方式。

0

我打算假設現在不可能改變你的數據結構,並從那裏開始。請記住,傳遞給itemRenderer的數據元素表示dataProvider中的單個項目。在你第一種情況下,這將是一個字符串,像這樣:

foo 

在第二種情況下,這將是一個對象,像這樣:

{DESC:"foo", ID:"0"} 

因此,在第一種情況下你的標籤由於它是一個字符串,因此被正確顯示。在第二種情況下,Flex將在您的對象上運行toString()方法,並返回您看到的[Object object]綽號。

要在一個itemRenderer中執行此操作,您需要更新文本在標籤上的設置方式。這些步驟是這樣的:

1)從標籤 2)聽在dataChange事件處理程序的itemRenderer組件 3)dataChange事件中刪除綁定文本屬性,請檢查你有什麼類型的數據並使用它根據數據類型有條件地設置Label上的文本值。

這是僞代碼,但是這是要點

<?xml version="1.0" encoding="utf-8"?> 

<fx:Script> 
    protected function onDataChange(event:Event):void{ 
     if(data is Object){ 
     labelDisplay.text = data.DESC; 
     } else { 
     labelDisplay.text = data; 
     } 
    } 
</fx:Script> 
<s:states> 
    <s:State name="normal"/> 
    <s:State name="hovered"/> 
    <s:State name="selected"/> 
</s:states> 
<s:Label id="labelDisplay" backgroundColor.selected="#1B5790" color.selected="white" 
     backgroundColor.hovered="#E1DFD2" color.hovered="white" fontWeight.hovered="bold" 
     width="100%" height="25" paddingLeft="5" paddingTop="5" styleName="myLabelBlack" toolTip="{data}"/> 

[使用同樣的方法設置工具提示]

有許多儘管如此,不同的方式來做這件事。您可以使用基本組件創建一個超類,並對其進行擴展,覆蓋相應類型數據的onDataChange事件處理程序。那麼你有三個分量(超級部件,所述數據作爲一個字符串分量和數據作爲對象成分),但你會重新使用散裝的代碼。

如果你有你的第二個數據定義明確的對象類型,只是實現自定義的toString()方法返回描述和使用已定義的原始的itemRenderer。