private static void RefreshFixedHeaderFooter( DataGridControl dataGrid, Panel targetPanel, ObservableCollection<DataTemplate> collection )
    {
      TableViewScrollViewer tableViewScrollViewer = dataGrid.ScrollViewer as TableViewScrollViewer;
      RowSelectorPane rowSelectorPane = ( tableViewScrollViewer != null ) ? tableViewScrollViewer.RowSelectorPane : null;

      foreach( HeaderFooterItem element in targetPanel.Children )
      {
        if( rowSelectorPane != null )
        {
          rowSelectorPane.FreeRowSelector( element );
        }

        dataGrid.ClearItemContainer( element, GetFixedItem( element ) );
        DataGridControl.SetDataGridContext( element, null );
      }

      targetPanel.Children.Clear();

      DataGridContext dataGridContext = dataGrid.DataGridContext;
      foreach( DataTemplate template in collection )
      {
        HeaderFooterItem control = new HeaderFooterItem();

        control.Content = dataGrid.DataContext;
        control.ContentTemplate = template;

        DataGridControl.SetDataGridContext( control, dataGridContext );
        dataGrid.PrepareItemContainer( control, template );

        DataGridControl.SetFixedItem( control, template );
        GroupLevelIndicatorPane.SetGroupLevel( control, -1 );

        targetPanel.Children.Add( control );
      }
    }
    private static void ClearFixedHostPanelHelper( DataGridControl dataGrid, UIElementCollection collection )
    {
      TableViewScrollViewer tableViewScrollViewer = dataGrid.ScrollViewer as TableViewScrollViewer;
      RowSelectorPane rowSelectorPane = ( tableViewScrollViewer != null ) ? tableViewScrollViewer.RowSelectorPane : null;

      foreach( DependencyObject headerFooterItem in collection )
      {
        if( rowSelectorPane != null )
        {
          rowSelectorPane.FreeRowSelector( headerFooterItem );
        }

        dataGrid.ClearItemContainer( headerFooterItem, GetFixedItem( headerFooterItem ) );
        DataGridControl.SetDataGridContext( headerFooterItem, null );
      }

      collection.Clear();
    }