| Flex 2 開発ガイド > Flex アプリケーションのユーザーインターフェイスの作成 > データプロバイダおよびコレクションの使用 > 階層データプロバイダの使用 > データ記述子と階層データプロバイダ構造 | |||
Tree およびメニューコントロールで使用する階層データは、データ記述子クラスを使用して解析および操作できる形式であることが必要です。"データ記述子" は、階層コントロールとデータプロバイダオブジェクト間のインターフェイスを提供するクラスです。データ記述子はコントロールに固有のメソッドのセットを実装しており、データプロバイダの内容と構造を決定するほか、データの取得、追加、削除、およびコントロールに固有のデータプロパティの変更を行います。
Flex では、階層コントロールのために次の 2 種類のデータ記述子インターフェイスが定義されています。
ITreeDataDescriptor Tree コントロールで使用されるメソッド
IMenuDataDescriptor Menu、MenuBar、PopUpMenuButton の各コントロールで使用されるメソッド
Flex フレームワーク には、両方のインターフェイスを実装する DefaultDataDescriptor クラスが用意されています。dataDescriptor プロパティを使用して、デフォルトの記述子構造に適合しないデータモデルを処理するカスタムデータ記述子クラスを指定できます。
両インターフェイスのメソッドと DefaultDataDescriptor クラスの動作を次の表に示します。インターフェイス / メソッド項目の 1 行目は、そのメソッドが ITreeDataDescriptor インターフェイス、IMenuDataDescriptor インターフェイス、またはその両方のいずれに属するか、つまりそのメソッドがツリー、メニュー、またはその両方のいずれで使用されるかを示します。
|
インターフェイス / メソッド |
戻り値 |
DefaultDataDescriptor の動作 |
|---|---|---|
|
両方 hasChildrent(node, [model]) |
ノードが子に分岐しているかどうかを示すブール値 |
XML では、ノードが少なくとも 1 つの子エレメントを持つ場合に その他のオブジェクトでは、ノードの |
|
両方 getChildren(node, [collection]) |
ノードの子 |
XML では、子エレメントを持つ XMLListCollection を返します。 その他のオブジェクトでは、ノードの |
|
両方 isBranch(node, [collection]) |
ノードがブランチであるかどうか |
XML では、ノードが少なくとも 1 つの子を持つ場合、またはノードが その他のオブジェクトでは、ノードが |
|
両方 getData(node, [collection]) |
ノードデータ |
ノードを返します。 |
|
両方 addChildAt(node, child, index, [model]) |
処理が成功したかどうかを示すブール値 |
すべての場合で、現在インデックスの位置にあるノードの前に子オブジェクトとしてノードを挿入します。 |
|
両方 removeChildAt (node, index, [model]) |
処理が成功したかどうかを示すブール値 |
すべての場合で、インデックス位置にあるノードの子を削除します。 |
|
IMenuDataDescriptor getType(node) |
メニューノードタイプを表すストリング。有効な値は |
XML では、ノードの その他のオブジェクトでは、ノードの |
|
IMenuDataDescriptor isEnabled(node) |
メニューノードが有効かどうかを示すブール値 |
XML では、ノードの その他のオブジェクトでは、ノードの |
|
IMenuDataDescriptor setEnabled(node, value) |
|
XML では、ノードの その他のオブジェクトでは、ノードの |
|
IMenuDataDescriptor isToggled(node) |
メニューノードが選択されているかどうかを示すブール値 |
XML では、ノードの その他のオブジェクトでは、ノードの |
|
IMenuDataDescriptor setToggled(node, value) |
|
XML では、ノードの その他のオブジェクトでは、ノードの |
|
IMenuDataDescriptor getGroupName (node) |
ノードが属するラジオボタングループの名前 |
XML では、ノードの その他のオブジェクトでは、ノードの |
次の例の Object は、Tree コントロールのデフォルトのデータプロバイダ構造に従っており、DefaultDataDescriptor クラスによって正しく処理されます。
[Bindable]
public var fileSystemStructure:Object =
{label:"mx", children: [
{label:"Containers", children: [
{label:"Accordian", children:[]},
{label:"DividedBox", children: [
{label:"BoxDivider.as", data:"BoxDivider.as"},
{label:"BoxUniter.as", data:"BoxUniter.as"}]},
{label: "Grid", children:[]}]},
{label: "Controls", children: [
{label: "Alert", data: "Alert.as"},
{label: "Styles", children: [
{label: "AlertForm.as", data:"AlertForm.as"}]},
{label: "Tree", data: "Tree.as"},
{label: "Button", data: "Button.as"}]},
{label: "Core", children:[]}
]};
オブジェクトの場合、ルートは Object インスタンスであるため、(XML と同様に) 常に単一のルートが存在する必要があります。ネストされた Array を含む Array をデータプロバイダとして使用することもできます。この場合、プロバイダにはルートは存在せず、最上位の配列の各エレメントがコントロールの最上位に表示されます。
DefaultDataDescriptor は、整形式の XML ノードを適切に処理できます。ただし、isBranch() メソッドが true を返すのは、パラメータノードが子ノードを持つ場合、またはノードが値 true の isBranch 属性を持つ場合のみです。したがって、XML オブジェクトで、isBranch 属性を true に設定する以外の方法で空のブランチを示す場合は、カスタムデータ記述子を作成する必要があります。
DefaultDataDescriptor はコレクションを適切に処理します。たとえば、ノードの children プロパティが ICollectionView である場合、getChildren() メソッドは子を ICollectionView オブジェクトとして返します。
<mx:Model> タグを使用して、MXML でデータプロバイダ構造を定義できます。Flex コンパイラは、このタグの内容を ActionScript オブジェクトの階層グラフに変換します。<mx:Model> タグには、ActionScript で Object データプロバイダを定義する場合と比べて、次の 2 つの利点があります。
<mx:Model> を使用して、そのデータを複数の動的ソースから取得するオブジェクトベースのデータプロバイダを作成できます。データ記述子を使用するコントロールで <mx:Model> タグを使用するためには、コンパイラによって生成されるオブジェクトが、データ記述子と階層データプロバイダ構造にあるデータ記述子要件に適合している必要があります。また、XML オブジェクトと同様、タグが単一のルートエレメントを持つ必要があります。
ほとんどの場合、<mx:Model> タグを使用する代わりに、<mx:XML> タグまたは <mx:XMLList> タグを使用することを検討してください。これらのタグの説明は、XML データプロバイダの使用にあります。XML ベースのタグはエレメントへのデータバインディングをサポートしており、DefaultDataDescriptor クラスは整構造の XML をすべてサポートしています。したがって、ノード名がその機能を表すような、より自然な構造を使用でき、"children" という不自然なノード名にする必要がなくなります。
DefaultDataDescriptor クラスを使用するコントロールのデータプロバイダとして <mx:Model> タグを使用するためには、子ノードの名前がすべて "children" であることが必要です。この要件は Object を使用する場合とは異なります。Object を使用する場合は、子オブジェクトを含む配列の名前を children にします。
次のコードは、メニューのデータプロバイダとして <mx:Model> タグを使用し、タグ内でデータバインディングを指定する例を示します。また、メニュー構造を動的に変更する方法も示しています。
<?xml version="1.0"?>
<!-- dpcontrols\ModelWithMenu.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*">
<mx:Script>
<![CDATA[
import mx.controls.Menu;
public var productMenu:Menu;
public function initMenu(): void
{
productMenu = Menu.createMenu(null, Products.Department);
productMenu.setStyle("disabledColor", 0xCC3366);
productMenu.show(10,10);
}
]]>
</mx:Script>
<mx:Model id="Products">
<Root>
<Department label="Toys">
<children label="Care Bear"/>
<children label="GI Joe"/>
<children label="Telly Tubbies"/>
</Department>
<Department label="Kitchen">
<children label="Electronics">
<children label="Crock Pot"/>
<children label="Panini Grill"/>
</children>
<children label="Cookware">
<children label="Grill Pan"/>
<children label="Iron Skillet" enabled="false"/>
</children>
</Department>
<!-- The items in this entry are bound to the form data -->
<Department label="{menuName.text}">
<children label="{item1.text}"/>
<children label="{item2.text}"/>
<children label="{item3.text}"/>
</Department>
</Root>
</mx:Model>
<mx:Button label="Show Products" click="initMenu()"/>
<!-- If you change the contents of the form, the next time you
display the Menu, it will show the updated data in the last
main menu item. -->
<mx:Form>
<mx:FormItem label="Third Submenu title">
<mx:TextInput id="menuName" text="Clothing"/>
</mx:FormItem>
<mx:FormItem label="Item 1">
<mx:TextInput id="item1" text="Sweaters"/>
</mx:FormItem>
<mx:FormItem label="Item 2">
<mx:TextInput id="item2" text="Shoes"/>
</mx:FormItem>
<mx:FormItem label="Item 3">
<mx:TextInput id="item3" text="Jackets"/>
</mx:FormItem>
</mx:Form>
</mx:Application>
Flex 2.01