2011-06-23 2 views
0

動的に更新するツリー形式で表示する必要がある、多少複雑な親/子階層オブジェクトがあります。それをツリーにデータプロバイダとして渡すために、私はトップレベルの親をArrayに変換し、次にArrayCollectionに変換します。問題は、階層内の何かが変更された場合、データプロバイダを再生成しない限り、ツリーが動的に更新されないということです。FlexデータバインディングオブジェクトをArrayCollectionに変換しました

編集:たくさんのコードが表示されていなかったので、下のすべてがどのように使用されているかのスケルトンバージョンを含めるようにしました。ツリーはうまく機能し、ノードを削除/追加しても変更は明らかですが、スクロールバーは更新されません(サイズは変更されません)。スクロールすると、ツリーが壊れてしまい、削除されたツリーの下部に空白が表示されることがあります。

複数のレベルを持つ単純なバインド可能なArrayCollectionテストオブジェクトを試してみましたが、正しく更新されるため、ツリーがうまくいくと思うので、問題を抱えているdataproviderをバインドしようとしています。

AS3クラス1 - insertCustomObjectを(呼び出すことによって、自身の子オブジェクトの多くを持つことができるオブジェクト)

public function CustomObject() { 

} 
public function insertCustomObject(customObject : CustomObject) : void { 
    customObject.parent = this; 
} 

AS3クラス2は - 私が欲しいものである子どもたちの多くを持つことになります単一CustomObjectが含まれていますツリーとして表示されます。

public class CustomContainer { 
    private var _root : CustomObject; 

    public function rootAsCollection() : ArrayCollection { 
     return new ArrayCollection(new Array(_root)); 
    } 
} 

MXMLコンポーネント1 - カスタム・ツリー・コンポーネントを含み、それを通過するdataProviderとして使用するcustomObjects

[Bindable] 
private var customContainer : CustomContainer; 

<component:TreeCustom id="treeCustom" width="100%" customObjects="{customContainer.rootAsCollection()}"/> 

MXMLコンポーネント2 - ツリー自体は、MXMLコンポーネントからcustomObjectsパラメータを取り込み1それをdataproviderに設定する。

[Bindable] 
private var _customObjects : ArrayCollection; 

public function set customObjects(objects : ArrayCollection) : void { 
    _customObjects = objects; 
} 

<mx:Tree id="customTree" dataProvider="{_customObjects}" /> 
+0

あなたは 'HierarchicalData'の代わりに、' ArrayCollection'を使用してみましたか?あなたのデータ構造がどのように見えるかを知らなくても、それは今私が持っている最良の提案です。 –

答えて

0

ツリー内の子アイテムのリストを提供するときは、配列の代わりにArrayCollectionを使用する必要があります。 Arrayは、要素が追加または削除されたときに変更イベントをディスパッチしないので、ツリーはそれに応じて更新できません。ここで

は、データ階層を構成するためのユーザーであることができるクラスの例です。

public class Person extends EventDispatched 
{ 

    public function Person(name:String, children:ArrayCollection) 
    { 
     super(); 

     this.name = name; 
     this.children = children; 
    } 

    [Bindable] 
    public var name:String; 

    [Bindable] 
    public var children:ArrayCollection; 

} 
+0

私はArrayCollectionを使用しています。最初にArrayに変換してから、ArrayCollectionに渡すことができます。私は私の問題は、実際のオブジェクトへの変更が完全には検出されないように、Bindableオブジェクトをそのまま渡すことができる代わりに、ツリーで使用可能な形式にオブジェクトを変換する必要があるという事実から生じると思います。木。 – PublicHandle

関連する問題