2011-01-26 60 views
0

我有一個Flex樹控件,並試圖選擇一個樹節點,然後在dataProvider分配給像下面這樣的集合對象之後的3個級別。Flex:在dataProvider被分配/更新/替換之後立即選擇樹節點

基本上treeItem1,treeItem2,treeItem3是樹中的節點,而treeitem3是treeItem2的子樹,它是treeItem1的子樹。假設這些treeItem(1,2,3)被正確地從集合項中引用。

我的問題是,如果我等待整個組件完全加載然後選擇節點,它會正確打開/選擇/ scrolltoIndex。但是,如果我在分配dataProvider之後立即選擇節點,那麼它甚至不會打開或選擇(基本上this.treeService.selectedItem始終爲空)。

任何人都可以指出我做錯了什麼? dataProvider分配後是否有任何需要發生的事情?

感謝

this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource(); 
this.treeService.expandItem(treeItem1, true); 
this.treeService.expandItem(treeItem2, true); 
this.treeService.selectedItem = treeItem3; 
this.treeService.scrollToIndex(this.treeService.selectedIndex); 

回答

2

我已經使用了updateComplete事件時,要知道一個組件(如DATAGROUP或列表)在執行簡單任務(例如更新dataProvider引用)後已完成渲染。當然,你必須小心並刪除監聽updateComplete,因爲它可以運行很多,除非你需要它運行。

喜歡的東西:

//...some function... 
    this.treeService.addEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete); 
    this.treeService.dataProvider = oPricingHelper.getCurrentPricingSercicesTreeSource(); 
//...rest of some function... 

private function onTreeUpdateComplete(event:FlexEvent):void { 
    this.treeService.removeEventListener(FlexEvent.UPDATE_COMPLETE, onTreeUpdateComplete); 
    this.treeService.expandItem(treeItem1, true); 
    this.treeService.expandItem(treeItem2, true); 
    this.treeService.selectedItem = treeItem3; 
    this.treeService.scrollToIndex(this.treeService.selectedIndex); 
} 
0

我還不能肯定你遇到同樣的問題,但我似乎有同一類型的問題,採用了先進的數據網格,它會出現在這些情況下dataProvider是可以接受的多種類型,組件會在後臺執行一些額外的工作,以將其包裝到Hierarchical(HierarchicalData或HierarchicalCollectionView)中,並且在此過程中數據提供者setter調用不是同步的(因此它會在實際分配內部屬性(存儲數據提供者)。在這種情況下,我使用了callLater,並且取得了一定的成功,callLater通常是一種不好的做法,但基本上在函數列表中添加了一個函數,以便在後臺處理完成後調用,因此這是假設數據提供者設置器中的某些內容稱爲UIComponent.suspendBackgroundProcessing ()並且隨後會調用UIComponent.resumeBackgroundProcessing(),然後它將執行使用callLater添加的函數列表。或者,你可以使用setTimeout(someFunction,1000)。

這些都是「黑客」,真正的解決方案是深入研究框架代碼,並看看它告訴它設置數據提供者時真的在做什麼。無論你看到它實際上設置了數據提供者,你都可以擴展該類,並派發一個你可以監聽的事件來運行該功能,以便在此之後進行選擇。

如果有人通過各種手段更好的解決方案,請大家指正(我很想有比這更好的答案)