1

ListCollectionView 通常被宣传为菊花链相同数据的不同视图的好方法。您有一些源集合,然后使用 ListCollectionView + filterFunction 包装源数据并呈现该源集合的子集。当源集合更改(添加或删除)时,链接的 LCV 会自动更新。但是,如果源集合的 filterFunction发生更改,它似乎不会传播到链接的 LCV:

ArrayCollection source = new ArrayCollection(new Array({name: 'Matt'}, {name: 'John'}, {name: 'Zach'}));
ListCollectionView justMatts = new ListCollectionView(source);
justMatts.filterFunction(function(obj: Object):Boolean { obj.name == 'Matt' });
justMatts.refresh();

如果我向 中添加一个新的 Matt 对象sourcejustMatts将获取该更改并按预期重新运行其过滤器。

但是,如果我添加一个过滤器source以排除 Matt 对象,justMatts则不会对源过滤器进行该更改:

source.filterFunction(function(obj: Object):Boolean { obj.name != 'Matt' });
source.refresh();

在这一点上,我希望 justMatts 收到 aCollectionChangeEvent并重新运行它的过滤器。由于所有的 Matts 都已从source对象中过滤掉,因此justMatts也将是空的。但是,如果您查看ListCollectionView代码,它们不会处理应用新过滤器CollectionEventKind.REFRESH时触发的内容。source我在这里做错了什么(使用错误的类等)还是在 Flex 中不支持source过滤的更改。

我可以通过手动调度CollectionEventKind.RESETon来实现我期望的工作source,但我希望不必对任何东西进行子类化。

4

1 回答 1

0

我根本没想到它会那样工作。我希望 ArrayCollection(这是一个 LisCollectionView)和显式 ListCollectionView 的来源是相同的,它们的过滤器独立运行。

但是,如果您查看这两个类的源代码,您可能会发现过滤 AC 不会调度 CollectionChange 事件(值得怀疑,因为它需要刷新),或者 LCV 不侦听该事件并且更新。

如果您首先将过滤器应用于列表,然后创建 ListCollectionView,您会看到预期的结果吗?如果不是,那么我认为您误读了它应该如何工作。如果你这样做,那么我有;-)

于 2011-12-08T17:43:17.870 回答