我有一个全局数组收集,它包含与一类数据集有关的所有信息。我希望有不同的数据网格来过滤数据,通常是通过使特定列等同。怎么应该这样呢?
编辑:到目前为止我的想法: 如果有一个数据网格的过滤函数而不是底层的数组,那就可以解决问题。或者,如果可以使用“子集arraycollection”反映全局arraycollection,该子集自动过滤全局arraycollection,当然,也会自动反映底层数组集合中的更改,也可以这样做。这些解决方案中的任何一个都是自然的/平凡的吗?
答案 0 :(得分:4)
您应该使用ListCollectionView。
它允许底层源集合的自定义过滤器。对源集合的更改将反映在已过滤的视图中。
即:
[Bindable]
public var allTheData:ArrayCollection;
<mx:ListCollectionView list="{allTheData}" filterFunction="myFilterFunction" id="filteredView1" />
<mx:DataGrid dataProvider="{filteredView1}" />
答案 1 :(得分:0)
这是一种方法。虽然此示例使用Lists,但它应该适用于DataGrids,因为它是被过滤的集合而不是视图。 “添加列表项”按钮和addListItems()方法显示了一种在基础数据更改时更新过滤后的列表的方法。
<fx:Script>
<![CDATA[
private function populateListA(collection:ArrayCollection):ArrayCollection
{
var ac:ArrayCollection = new ArrayCollection(collection.source);
ac.filterFunction = filterListA;
ac.refresh();
return ac;
}
private function populateListB(collection:ArrayCollection):ArrayCollection
{
var ac:ArrayCollection = new ArrayCollection(collection.source);
ac.filterFunction = filterListB;
ac.refresh();
return ac;
}
private function filterListA(item:Object):Boolean
{
return item == "ListA";
}
private function filterListB(item:Object):Boolean
{
return item == "ListB";
}
private function addListItems():void
{
arrayCollection.addItem("ListA");
arrayCollection.addItem("ListB");
listA.dataProvider = populateListA(arrayCollection);
listB.dataProvider = populateListB(arrayCollection);
}
]]>
</fx:Script>
<fx:Declarations>
<s:ArrayCollection id="arrayCollection">
<fx:Array>
<fx:String>ListA</fx:String>
<fx:String>ListA</fx:String>
<fx:String>ListA</fx:String>
<fx:String>ListB</fx:String>
<fx:String>ListB</fx:String>
<fx:String>ListB</fx:String>
</fx:Array>
</s:ArrayCollection>
</fx:Declarations>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<s:List id="listA"
dataProvider="{populateListA(arrayCollection)}"/>
<s:List id="listB"
dataProvider="{populateListB(arrayCollection)}"/>
<s:Button click="addListItems()"
label="Add List Items"/>