我正在研究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,每次编辑一个字段时,在数据网格内,三个列表都会更新。如果需要更多信息,请告诉我。我不能把真正的代码放在这里,因为这不是我正在开发的一个开源项目。
答案 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);
}