如何在Flex分组集合中维护开放节点

时间:2012-05-17 08:51:21

标签: actionscript-3 flex mxml

我有一个Flex应用程序,它有一个包含分组集合的高级数据网格。我希望屏幕最初关闭所有节点。用户可以从那里选择打开一个或两个并查看其中的信息。如果单击其中一个节点子节点,它会使用视图堆栈将视图更改为包含该子节点的更多信息的屏幕。然而,当我们返回到初始屏幕时,它返回所有节点再次关闭。

我希望应用程序能够记住哪些节点保持打开状态以及最后点击的项目是什么并突出显示。

我尝试使用IHierarchicalCollectionView(dataProviderName).openNodes,并在视图更改时将其分配给Object,并在返回时将此对象Assisning为IHierarchicalCollectionView(dataProviderName).openNodes。但该应用程序似乎进入循环,IE停止响应。

这是我的DataGrid的代码。任何帮助,将不胜感激。

    public class SummaryGridBase extends AdvancedDataGrid
{

    [Bindable]
    protected var _modelLocator:ModelLocator = ModelLocator.getInstance();

    [Bindable]
    override public function set dataProvider(value:Object):void
    {
        super.dataProvider = value;
    }

    override protected function collectionChangeHandler(event:Event):void
    {
        super.collectionChangeHandler(event);
        trace("Summary Grid Trace 1");
        if( event is CollectionEvent && (event as CollectionEvent).kind == CollectionEventKind.REFRESH )
        {
            trace("Summary Grid Trace 2");
            this.validateGridAndExpand();
        }           
    }

    private function validateGridAndExpand():void
    {
        this.validateNow();
        var rootLevel:ArrayCollection = ModelLocator.getInstance().groupingCollection.getRoot() as ArrayCollection;
        for each( var item:Object in rootLevel )
        {
            this.expandItem( item, true, false );
        }
    }

    protected function changeHandler(event:ListEvent):void
    {
        trace("Change in Summary Data Selection" +(this.selectedItem.Business));
        if( this.selectedItem.Business == null )
        {
            trace("Im Null");
            Alert.show( "Please Expand a Vendor Using The Arrow Beside it \nand Select a Polymer From the List", 'Warning', mx.controls.Alert.OK);
        }
        else
        {
            var summaryEvent:SummaryEvent = new SummaryEvent( SummaryEvent.SELECT_SUMMARY, (this.selectedItem.Business as String), (this.selectedItem.Op_Site as String),(this.selectedItem.Vendor as String),(this.selectedItem.Item_Desc as String) );
            summaryEvent.dispatch();
        }
    }

    public function SummaryGridBase()
    {
        super();
    }
}

1 个答案:

答案 0 :(得分:1)

我偶然发现了这个问题并且最近遇到了同样的问题。我知道它已经很晚了但是为了互联网,这对我有用。

我(最终)找到了答案here

所以有两个部分,首先是数据更新,首先获得打开节点的分层视图,并在分组集合更新后恢复:

var hierarchical:IHierarchicalCollectionView = advDatagrid.dataProvider as IHierarchicalCollectionView;

var openNodes:Object = hierarchical.openNodes;

grpCollection.refresh();

advDatagrid.dataProvider = grpCollection;
advDatagrid.validateNow();
IHierarchicalCollectionView(advDatagrid.dataProvider).openNodes = openNodes;

但另一部分是设置分组对象功能。

所以在你的分组定义中:

<mx:GroupingCollection2 id="grpCollection" source="{data}">
<mx:Grouping groupingObjectFunction="grpObjFunc">
    <mx:GroupingField name="name"/>
</mx:Grouping>

一个返回唯一ID的简单函数:

    private function grpObjFunc(value:String):Object
{
    return {uid:value};
}