Как следует просматривать разные отфильтрованные данные в разных сетках данных, использующих один и тот же базовый набор ArrayCollection? - PullRequest
2 голосов
/ 07 ноября 2010

У меня есть глобальная коллекция массивов, которая содержит всю информацию, относящуюся к типу набора данных.Я хотел бы иметь различные сетки данных, которые фильтруют данные, как правило, приравнивая определенный столбец.Как можно поступить об этом?

Редактировать: Мое мышление до сих пор: если бы существовала функция фильтра для сетки данных, а не базовая коллекция массивов, это решило бы проблему.В качестве альтернативы, если можно отразить глобальную коллекцию массивов с помощью «коллекции массивов подмножеств», которая автоматически отфильтровывает глобальную коллекцию массивов и, конечно, автоматически отражает изменения в базовой коллекции массивов, это также будет сделано.Является ли одно из этих решений естественным / тривиальным в flex?

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

Вы должны использовать ListCollectionView для этого.

Позволяет настраивать фильтры из исходной коллекции. Изменения в исходной коллекции отражаются в отфильтрованном представлении.

Т.е.:

 [Bindable]
 public var allTheData:ArrayCollection;


 <mx:ListCollectionView list="{allTheData}" filterFunction="myFilterFunction" id="filteredView1" />


<mx:DataGrid dataProvider="{filteredView1}" />
0 голосов
/ 08 ноября 2010

Вот один из способов сделать это.Хотя в этом примере используются списки, он должен работать для 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"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...