2011-01-26 7 views
0

私はFlexツリーコントロールを持っていますが、dataProviderに次のようなコレクションオブジェクトが割り当てられた直後にツリーノードを3レベル下に選択しようとしています。Flex:dataProviderの割り当て/更新/置換直後にツリーノードを選択

基本的にtreeItem1、treeItem2、treeItem3はツリー内のノードであり、treeitem3はtreeItem1の子であるtreeItem2の子です。これらのtreeItem(1,2,3)がコレクション項目から正しく参照されているとします。

私の問題は、コンポーネント全体が完全にロードされるのを待ってからノードを選択すると、/ select/scrolltoIndexが正しく開くということです。しかし、dataProviderが割り当てられた直後にノードを選択すると、ノードが開かれたり選択されたりもしません(基本的にthis.treeService.selectedItemは常にnullです)。

誰かが間違ったことを指摘できますか? 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イベントを使用していました)は、単純なタスク(dataProvider参照の更新など)を実行した後にレンダリングを完了しました。もちろん、それを実行する必要がない限り、updateCompleteを十分に実行できるので、注意深く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にとして許容されるこれらの場合に表示されます(HierarchicalDataまたはHierarchicalCollectionView)に置き換えて、データプロバイダ設定呼び出しが同期していない(データプロバイダを格納する内部プロパティが実際に割り当てられる前に返される) )。私はこの場合callLaterを適度な成功を収めて使用してきましたが、callLaterは一般的に悪い習慣ですが、基本的にバックグラウンド処理が完了したら関数のリストに関数を追加するので、dataprovider setterの何かがUIComponent.suspendBackgroundProcessingその後UIComponent.resumeBackgroundProcessing()を呼び出し、callLaterを使用して追加された関数のリストを実行します。あるいは、setTimeout(someFunction、1000)を使用することもできます。

これらはどちらも「ハック」であり、実際のソリューションはフレームワークコードを掘り下げて、データプロバイダを設定するときに実際に何をしているのかを確認することです。どこにいても、実際にデータプロバイダを設定していれば、そのクラスを拡張して、このポイントの後で選択を行うための関数を実行するためのリッスンできるイベントを送出できます。

、誰もがすべての手段によって、よりよい解決策をしてください持っている場合は、(私はこれよりも良い答えを持っているのが大好きだ)私を修正

関連する問題