0

目的:リストの itemRenderer (ボタン) にスキンを渡し、そのリスト内のすべてのボタンにスキンを適用できるようにしたいと考えています。

これは私が持っているものです:

リスト:

<s:List itemRenderer="renderers.ItemRenderer" dataProvider="{collectionWorkspace}" />

配列コレクション:

<s:ArrayCollection id="collectionWorkspace">
    <comp:Layout1 />
    <comp:Layout2 />
    <comp:Layout3 />
    <comp:Layout4 />
    <comp:Layout5 />
</s:ArrayCollection>

レイアウトは、HostComponent ボタンを持つスキン クラスです。

アイテムレンダラー:

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
                xmlns:mx="library://ns.adobe.com/flex/halo"
                xmlns:s="library://ns.adobe.com/flex/spark">

    <s:states>
        <s:State name="normal" />
    </s:states>

    <s:Button skinClass="{data}"/>

</s:ItemRenderer>

エラーが表示されます(明確化のために修正): エラー: アプリケーションのスキン....ボタン 1 が見つかりません。

4

1 に答える 1

2

実際のクラスではなく、スキン クラスのインスタンスをプロパティに渡しskinClassます (ボタンはスキン クラスの独自のインスタンスを作成する必要があります)。

可能であれば、最善の方法はcollectionWorkspace、インスタンスではなく Class オブジェクトの配列にすることです。

<s:ArrayCollection id="collectionWorkspace">
    <fx:Class>yourPkg.Layout1</fx:Class>
    <fx:Class>yourPkg.Layout2</fx:Class>
    <fx:Class>yourPkg.Layout3</fx:Class>
    <fx:Class>yourPkg.Layout4</fx:Class>
    <fx:Class>yourPkg.Layout5</fx:Class>
</s:ArrayCollection>

それができない場合は、インスタンスのクラスを取り出してskinClass.

<s:Button skinClass="{Object(data).constructor}"/>

編集:

クラスで初期化dataされる前と同じように開始されるため、デフォルトではバインディングは機能しません。nullを指定nullすると、例外が発生します。nullこれを修正するには、時間と値の間のデフォルトを返す必要があります。

<s:Button skinClass="{data != null ? data as Class : spark.skins.spark.ButtonSkin}"/>

ArrayCollectionボタンスキンを使ってこれをやってみました。出来た。

于 2011-05-04T19:37:28.390 に答える