問題は、の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]としてマークされていないためです。