3

我正在实现某种组合框控件(通过扩展spark.components.supportClasses.DropDownListBase

现在,在这个控件里面;我需要知道:

  1. 如果数据提供者被更改/分配。(我可以做到……下面的第一种方法有效);
  2. 如果dataprovider 集合中的任何项目已更改。

我尝试了两种方法都没有成功...

第一种方法:

        [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
        }

第二种方法:

因为这是基于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
        }

有任何想法吗?

更新:上面已编辑。第一种方法让我知道数据提供者是否已更改,但如果数据提供者集合中的任何项目已更新,则不会。第二种方法根本不起作用..

4

1 回答 1

1

如果您向我们展示一个可运行的示例来演示问题,我们将能够提供更多帮助。

  1. 如果数据提供者被更改/分配。

您的第一种方法应该有效。你能告诉我们是什么让你认为它没有吗?(我假设没有跟踪声明?)。并告诉我们您为更改 dataProvider 做了什么。

第二种方法不起作用,因为 myClass 没有触发 collectionChange 事件。

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 回答