2012-10-30 77 views
0

我有我自己的自定義組件。該組件從基本容器中擴展而來。我想能夠訪問正在被可視化的itemRenderer實例。我知道組件mx:list有一個內部getter,它提供一個數組Array,它包含呈現每個數據提供程序項的itemRenderer實例。我想要同樣的東西。任何想法如何做到這一點?獲取呈現項目的列表

更具體地說:我將我的dataProvider項目的選定屬性設置爲true或false。從我的ItemRenderer的updateDisplayList函數中,我檢查屬性的更改並更正所選內容的邊框顏色。不幸的是我不得不強制updateDisplayList函數。我已經在列表中的一個ItemRenderer上執行了這個操作。只有列表是實用的,因爲通過創建我自己的列表,我能夠獲取正在呈現的項目列表並因此可視化(不能很多)。通過渲染的Items和updateDisplayList沒有任何開銷。但在這種情況下,我可以有100個項目。想象一下檢查和改變這麼多項目的風格。謝謝

+0

在Flex 3中,容器類,如Container,VBox,HBox和Canvas不使用項目渲染器。只有基於列表的控件('List','Horizo​​ntalList','DataGrid'等)。容器類僅僅呈現添加到它們的子對象。在Flex 4中,有一個使用項目渲染器的「DataGroup」容器類,但在Flex 3中沒有這樣的容器。 –

+0

這裏的問題是您爲什麼要訪問渲染器?你需要讓渲染器做他們最擅長的事情,並且渲染。沒有任何東西不能通過控件和數據提供者的組合來計算。 –

回答

1

Flex架構師故意做這個很難做到,因爲他們正在封裝組件。簡而言之,即使嘗試這樣做也違反了良好的面向對象原則。也就是說,你可能要做的事情中有90%可以通過操作數據項來完成,剩下的10%可以通過使用ClassRactory的ClassFactory來完成,它爲你的itemRenderer設置一個定製屬性itemRenderer添加到回調函數中,您可以查看可用於包含上下文的數據並提供基於此的值。

如果您詳細闡述了最終目標,我可以提供更多細節。


編輯在澄清光:

你需要讓你的數據對象類調度的事件時,它改變(單程是讓它可綁定,或只是讓所選擇的屬性可綁定)。然後,在您的渲染器中,聽取更改事件並採取適當的措施。

處理這個問題的第二種方法是刷新()集合,首先存儲selectedItem(如果你關心的話)並在刷新完成後重置它。

+0

_我詳細闡述了一點我的問題,你可以閱讀它上面。現在我正在瀏覽itemRenderer的完整列表並使顯示列表無效。但我想只在可視化的那個上做到這一點。通過基於Adobe mx:List創建我自己的列表,我能夠訪問listItems,它是一個內部變量,其中包含以下內容:實際呈現的Item的列表。從實際意義上講,可視化項目的數量永遠不會那麼多。但是對於基於容器的組件,我不知道如何。謝謝_ – Dave

0

我相信你可以通過getChildAt方法訪問itemRenderer實例。考慮到一些孩子是邏輯孩子,Flex 3的容器覆蓋「getChildAt」,「numChildren」,而一些孩子則是裝飾性的孩子,如背景,邊框和滾動條。

請記住,itemRenderer可能不會立即在dataProvider分配時變爲可用,因爲它們可能會在下一個組件生命週期中創建。檢查底層容器的文檔,找出在確定創建渲染器時要偵聽的事件,以便可以可靠地訪問它們。