3

私はある種のコンボボックスコントロールを実装しています(を拡張することによりspark.components.supportClasses.DropDownListBase

さて、このコントロールの中。私は知る必要がある:

  1. データプロバイダーが変更/割り当てられた場合。(私ができる...以下の最初のアプローチが機能します);
  2. dataprovider コレクション内のアイテムが変更された場合。

私はトリックをしなかった2つの方法を試しました...

最初のアプローチ:

        [Bindable("collectionChange")]
        override public function set dataProvider(value:IList):void
        {
            if (value) value.addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);

            super.dataProvider = value;
            trace("DATA CHANGED"); //fires
        }

        protected function onDataChange(event:CollectionEvent):void
        {
            trace("COLLECTION ITEM(S) CHANGED"); //does not fire
        }

2 番目のアプローチ:

これはに基づいているため、DropDownListBase; CollectionEvent.COLLECTION_CHANGEそれはすでにイベントをディスパッチする必要があります..?

        public function myClass() //constructor
        {
            addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
        }

        protected function onDataChange(event:CollectionEvent):void
        {
            trace("DATA CHANGED"); //does not fire
        }

何か案は?

更新:上記で編集..最初のアプローチでは、データプロバイダーが変更されたかどうかを知ることができますが、データプロバイダーコレクションでアイテムが更新されたかどうかはわかりません。2番目のアプローチはまったく機能しません..

4

1 に答える 1

1

問題を実証するために実行可能なサンプルを提示していただければ、さらに多くのことを支援できます。

  1. データプロバイダーが変更/割り当てられた場合。

あなたの最初のアプローチはうまくいくはずです。そうではないと思う理由を教えてください。(私が推測するトレースステートメントはありませんか?)。また、dataProvider を変更するために何をしたか教えてください。

myClass が collectionChange イベントを発生させないため、2 番目の方法は機能しません。

2 dataprovider コレクション内のアイテムが変更された場合。

これを伝える方法は実際にはありません。ほとんどの場合、コレクションは、他のオブジェクトへのポインタの単なるリストです。これらのポインターを変更すると、collectionChange イベントが発生します。ポインターが指しているアイテムを変更した場合、コレクションは何かが変更されたことを知る方法がありません。MXML ファンの場合、バインディングは非常によく似た方法で機能します。

アイテムの変更方法を制御できる場合は、そのように処理できます。それ以外の:

(collection.getITemAt(x) as myObject).property = newValue;

次のようにします。

  var myObject : MyObject = collection.getITemAt(x) as myObject
  myObject.property = newValue;
  collection.setItemAt(x, myObject);

それが collectionChange イベントを発生させることを期待していますが、前者ではありません。

つまり、dropDownListBase のコンテキストでは、ドロップダウンをスクロールしたり開いたり閉じたりすると、itemRenderers を更新して最新の dataProvider のデータを反映する必要があります。しかし、ドロップダウンが開いている間にその場で何かを変更した場合、自動的に更新されるとは思いません [dataProvider.

于 2011-01-10T22:15:52.050 に答える