public UpdateSelectionSourceHelper(
   SelectionManager selectionManager,
   UpdateSelectionSource newUpdateSelectionSource )
 {
   m_selectionManager = selectionManager;
   m_oldUpdateSelectionSource = selectionManager.m_currentUpdateSelectionSource;
   selectionManager.m_currentUpdateSelectionSource = newUpdateSelectionSource;
 }
    public DataGridControl()
    {
      m_selectionChangerManager = new SelectionManager( this );

      this.SetValue( DataGridControl.ParentDataGridControlPropertyKey, this );

      //set the FixedItem for the gridControl to NotSet, this is to prevent problems with nested DataGridControls
      DataGridControl.SetFixedItem( this, DataGridControl.NotSet );

      this.SetDetailConfigurations( new DetailConfigurationCollection( this, null ) );

      this.DetailConfigurations.CollectionChanged += this.OnDetailConfigurationsChanged;

      this.CommandBindings.Add( new CommandBinding( DataGridCommands.ExpandGroup, this.OnExpandGroupExecuted, this.OnExpandGroupCanExecute ) );

      this.CommandBindings.Add( new CommandBinding( DataGridCommands.CollapseGroup, this.OnCollapseGroupExecuted, this.OnCollapseGroupCanExecute ) );

      this.CommandBindings.Add( new CommandBinding( DataGridCommands.ToggleGroupExpansion, this.OnToggleGroupExecuted, this.OnToggleGroupCanExecute ) );

      this.CommandBindings.Add( new CommandBinding( ApplicationCommands.SelectAll, this.OnSelectAllExecuted, this.OnSelectAllCanExecute ) );

      this.CommandBindings.Add( new CommandBinding( DataGridCommands.ClearFilter, this.OnClearFilterExecuted ) );

      // We keep a references to be able to remove the CommandBindings when they are not required (feature disabled)
      m_refreshCommandBinding = new CommandBinding( DataGridCommands.Refresh, this.OnRefreshExecuted, this.OnRefreshCanExecute );
      this.CommandBindings.Add( m_refreshCommandBinding );

      // We keep a references to be able to remove the CommandBindings when they are not required (feature disabled)
      m_copyCommandBinding = new CommandBinding( ApplicationCommands.Copy, this.OnCopyExecuted, this.OnCopyCanExecute );
      this.CommandBindings.Add( m_copyCommandBinding );

      // The delete command is not enabled by default, so don't add it to CommandBindings
      m_deleteCommandBinding = new CommandBinding( ApplicationCommands.Delete, this.OnDeleteExecuted, this.OnDeleteCanExecute );

      DataGridContext dataGridContext = new DataGridContext( null, this, null, this.Items, null );
      m_customItemContainerGenerator = CustomItemContainerGenerator.CreateGenerator( this, this.Items, dataGridContext );
      m_customItemContainerGenerator.DetailsChanged += OnDetailsChanged;

      DataGridControl.SetDataGridContext( this, dataGridContext );
      m_localDataGridContext = dataGridContext;

      //so that at least one DataGridContext is always current
      dataGridContext.SetIsCurrentHelper( true );
      this.SetCurrentDataGridContextHelper( dataGridContext );

      this.SetValue( DataGridControl.ColumnsPropertyKey, dataGridContext.Columns );
      this.SetValue( DataGridControl.VisibleColumnsPropertyKey, dataGridContext.VisibleColumns );
      this.SetValue( DataGridControl.GroupLevelDescriptionsPropertyKey, dataGridContext.GroupLevelDescriptions );
      this.SetValue( DataGridControl.SelectedItemsPropertyKey, dataGridContext.SelectedItems );
      this.SetValue( DataGridControl.SelectedItemRangesPropertyKey, new SelectionItemRangeCollection( dataGridContext.SelectedItemsStore ) );
      this.SetValue( DataGridControl.SelectedCellRangesPropertyKey, new SelectionCellRangeCollection( dataGridContext.SelectedCellsStore ) );

      // Apparently, we don't need to unsubscribe from these event handlers. These event 
      // subscriptions do not "root" the grid and we observed no leak cause be these.
      // We did not investigate why that is and we should keep an eye on it.
      this.GroupStyle.CollectionChanged += new NotifyCollectionChangedEventHandler( GroupStyle_CollectionChanged );


      if( DesignerProperties.GetIsInDesignMode( this ) )
      {
        // Workaround for VS2008's know issue (the DataGrid's Template is not active).
        // TODO (case 117288): Remove when the issue will be corrected.
        this.ClipToBounds = true;
      }

      this.Loaded += new RoutedEventHandler( DataGridControl_Loaded );
      this.LayoutUpdated += new EventHandler( DataGridControl_LayoutUpdated );
    }