private bool TryGetParentGroupFromItemHelper( object item, out CollectionViewGroup collectionViewGroup ) { //This helper method is used to simplify previous code flow of the TryGetParentGroupFromItem method. collectionViewGroup = null; //----------------------------------------------- //1 - First check is to see of the item is a CVG. //----------------------------------------------- CollectionViewGroup groupItem = item as CollectionViewGroup; if( groupItem != null ) { Group group = this.GetGroupFromCollectionViewGroup( groupItem ); if( group != null ) { GroupGeneratorNode groupGeneratorNode = group.GeneratorNode; if( groupGeneratorNode.Parent == null ) { //no parent for speficied item. return true; } //if the nodeHelper was able to locate the content, use the nodeHelper's CurrentNode as the node for the item. collectionViewGroup = ( ( GroupGeneratorNode )groupGeneratorNode.Parent ).CollectionViewGroup; return true; } //item is a CVG, but is not present in the generator! return false; } //----------------------------------------------- //2 - Second check is to see if the item is already in the generated list //----------------------------------------------- //item might be in the "generated" list... much quicker to find-out if it is! //note: if the item belongs to a detail, then it will be excluded from the "fast" algo. int itemGenPosIndex = this.FindFirstGeneratedIndexForLocalItem( item ); if( itemGenPosIndex != -1 ) { //item was generated and was not from a DetailGeneratorNode if( m_genPosToNode[ itemGenPosIndex ].Parent == null ) { //no parent for speficied item. return true; } collectionViewGroup = ( ( GroupGeneratorNode )m_genPosToNode[ itemGenPosIndex ].Parent ).CollectionViewGroup; return true; } //----------------------------------------------- //3 - Third check is to check of the item is a GroupHeaderFooterItem //----------------------------------------------- if( item.GetType() == typeof( GroupHeaderFooterItem ) ) { GroupHeaderFooterItem groupHeaderFooterItem = ( GroupHeaderFooterItem )item; CollectionViewGroup parentGroup = groupHeaderFooterItem.Group; if( this.GetGroupFromCollectionViewGroup( parentGroup ) != null ) { //since the goal is the find the parentGroup from the item passed (which is a GroupHeader or GroupFooter), then the Group //is what I am looking for. collectionViewGroup = parentGroup; return true; } //Item was a GroupHeaderFooterItem but was not part of the genreator! return false; } //----------------------------------------------- //4 - Final Check //----------------------------------------------- //if the item was not generated, then try to find the item as is within the generator's content GeneratorNodeHelper finalNodeHelper = new GeneratorNodeHelper( m_startNode, 0, 0 ); if( finalNodeHelper.AbsoluteFindItem( item ) ) { //item was not generated but was part of this generator if( finalNodeHelper.CurrentNode.Parent == null ) { //no parent for speficied item. return true; } collectionViewGroup = ( ( GroupGeneratorNode )finalNodeHelper.CurrentNode.Parent ).CollectionViewGroup; return true; } else { return false; } //Default function behavior, if nobody else returned, then the function did not work as intended... as each "block" is supposed to return a value... throw new DataGridInternalException(); }