0

私が持っているこのバインド可能な配列コレクションに特定の文字列が存在するかどうかに基づいてCheckBox要素を表示しようとしていますが、機能していないようです。誰かが私が間違っていることを指摘してくれたら本当にありがたいです。

私のactionscriptコードには、

[Bindable]private var dataTypesUsed:ArrayCollection = new ArrayCollection();

そして私のフレックスコードでは、私は持っています

<s:CheckBox selected="true" label="test" id="testBox" visible="{dataTypesUsed.contains('Target')}" includeInLayout="{dataTypesUsed.contains('Target')}"/>
4

1 に答える 1

5

問題は、のcontains()メソッドがArrayCollection[Bindable]ではないことです。MXML中括弧式では、プロパティのチェーン内のすべてが[Bindable]である必要があります。

通常、中括弧式のプロパティの1つが[Bindable]でない場合、Flexコンパイラは警告を表示します。プロパティの1つが関数である場合、これは便利なショートカットになる可能性があるため、設計上、警告は生成されません。

関数は[バインド可能]としてマークできます。関数を定義するクラスのどこかにある限り、「バインディング」イベントがディスパッチされます。のソースコードを見てくださいListCollectionView-これは実際にcontains()メソッドを定義するクラスです。

contains()メソッドが[Bindable]としてマークされていないことがわかります。対照的に、getItemAt()メソッドはマークされています。

あなたはいくつかの異なる方法であなたの問題を解決することができます。カスタムバインディングイベントをディスパッチするものは次のとおりです。

[Bindable("dataTypesUsedChanged")]
private var dataTypesUsed:ArrayCollection = new ArrayCollection();

private function someMethodThatUpdatesTheCollection():void
{
    dataTypesUsed.addItem("foo");
    // addItem will make the collection dispatch CollectionEvent.COLLECTION_CHANGE
    dispatchEvent(new Event("dataTypesUsedChanged")

}

<s:CheckBox visible={dataTypesUsed.contains('foo')} />

違いは、[Bindable]メタデータでイベント名を指定しない場合、Flexはデフォルトの「propertyChanged」イベントを使用することです。

あなたのシナリオでは、バインディングをトリガーするために「propertyChange」イベントをディスパッチするものは何もありませんでした(b / cプロパティは文字通り変更されませんでした)。さらに、コレクションによってディスパッチされた「collectionChange」イベントは使用されていませんでしたcontains()。メソッドが[Bindable]としてマークされていないためです。

于 2012-10-03T19:58:03.787 に答える