Flex ListCollectionView包装列表,下面是什么魔术

时间:2011-12-14 21:23:16

标签: actionscript-3 flex

我正在研究Flex中的一个现有项目,并且试图找出数据从一个列表到另一个列表的方式,这一天被绊倒了一天。我想我已经弄清楚了,但我希望有一些Flex专家能够对正在发生的事情有所了解。

我会解释一下情况:

有一个数据源可以调用它,它将一个ArrayCollection(ac)加载到模型类(m)中。然后视图类(v)有两个ListCollectionViews l1和l2。 l1和l2都具有过滤功能,因此一半的数据从l1过滤掉,另一半从l2过滤掉。

现在这一切都有意义,但如果我将数据添加到l1或l2,它会自动添加到m.ac.这是怎么回事?我最好的猜测是,所有三个列表的基础数据结构是相同的。但是,由于我已经花了这么长时间坚持这一点,我很想知道发生了什么。谷歌在这方面没有太多帮助。

[更多信息] 根据要求,我将添加更多细节。对不起,我无法复制和粘贴我正在处理的内容。

内部模型:

      [Bindable] public var ac:ArrayCollection     = null;

内部数据源:

    private function resultHandlerac (event:ResultEvent) : void {
        var ac:ArrayCollection = helperClass.arrayFromResultEvent (event); 
        m.ac = ac;
      }

内部视图:

        [Bindable] public var l1:ListCollectionView;
        [Bindable] public var l2:ListCollectionView;

        private function resultHandlerac (ac:ArrayCollection) : void {

            week1Hours = new ListCollectionView(ac);
            week1Hours.filterFunction = function(i:Object) : Boolean { return i.WeekID 
            == 1 && !i.Removed; };

            week2Hours = new ListCollectionView(hoursData);
            week2Hours.filterFunction = function(i:Object) : Boolean { return i.WeekID 
            == 2 && !i.Removed; };

            l1.refresh();
            l2.refresh();
        }

并且有一个数据网格显示l1和l2,每次编辑一个字段时,在数据网格内,三个列表都会更新。如果需要更多信息,请告诉我。我不能把真正的代码放在这里,因为这不是我正在开发的一个开源项目。

1 个答案:

答案 0 :(得分:4)

你的直觉是正确的。 ListCollectionView只是您将其作为源集合提供的任何IList的包装器。它不会复制源集合中的项目。

当您对源集合进行过滤时,这会使源集合保持不变。例如:

var ac:IList = new ArrayCollection([1, 2, 3]);

var l1:ICollectionView = new ListCollectionView(ac);
//filter out only item '1'
l1.filterFunction = function(item:int):Boolean {return item == 1;}
l1.refresh();

var l2:ListCollectionView = new ListCollectionView(ac);
//filter out all items but '1'
l2.filterFunction = function(item:int):Boolean {return item != 1;}
l2.refresh();

trace(ac); //1,2,3
trace(l1); //1
trace(l2); //2,3

然而,与此同时,您仍然可以向其中添加项目,就好像它是包裹的Ilist本身一样:

l2.addItem(4);
trace(ac); //1,2,3,4
trace(l1); //1
trace(l2); //2,3,4

只需查看ListCollectionView的源代码,您就会看到会发生什么:

public function addItemAt(item:Object, index:int):void
{
    ...
    list.addItemAt(item, listIndex);
}