internal static void SetColumnReorderingDragSourceManager( DependencyObject obj, ColumnReorderingDragSourceManager value )
 {
   obj.SetValue( TableflowView.ColumnReorderingDragSourceManagerProperty, value );
 }
    private void SetupDragManager()
    {
      var dataGridContext = this.DataGridContext;
      // Can be null in design-time (edition of a style TargetType ColumnManagerCell).
      if( dataGridContext == null )
        return;

      // We do not support DragDrop when there are no AdornerLayer because there wouldn't be any visual feedback for the operation.
      AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer( this );
      if( adornerLayer == null )
      {
        // When virtualizing, the Cell is not yet in the VisualTree because it is the ParentRow's CellsHost which
        // is reponsible of putting them in the VisualTree. We try to get the adorner from the ParentRow instead
        if( this.ParentRow != null )
        {
          adornerLayer = AdornerLayer.GetAdornerLayer( this.ParentRow );
        }

        if( adornerLayer == null )
          return;
      }

      var dataGridControl = dataGridContext.DataGridControl;
      if( dataGridControl == null )
        return;

      if( m_dragSourceManager != null )
      {
        m_dragSourceManager.PropertyChanged -= this.DragSourceManager_PropertyChanged;
      }

      // The DataGridControl's AdornerDecoratorForDragAndDrop must be used for dragging in order to include the RenderTransform
      // the DataGridControl may performs. This AdornerDecorator is defined in the ControlTemplate as PART_DragDropAdornerDecorator
      if( ( dataGridControl.DragDropAdornerDecorator != null ) && ( dataGridControl.DragDropAdornerDecorator.AdornerLayer != null ) )
      {
        m_dragSourceManager = new ColumnReorderingDragSourceManager( this, dataGridControl.DragDropAdornerDecorator.AdornerLayer, dataGridControl, this.ParentRow.LevelCache );
      }
      else
      {
        m_dragSourceManager = new ColumnReorderingDragSourceManager( this, null, dataGridControl, this.ParentRow.LevelCache );
      }

      m_dragSourceManager.PropertyChanged += this.DragSourceManager_PropertyChanged;

      // Create bindings to ViewProperties for AutoScroll Properties
      Binding binding = new Binding();
      binding.Path = new PropertyPath( "(0).(1)", DataGridControl.DataGridContextProperty, TableView.AutoScrollIntervalProperty );
      binding.Mode = BindingMode.OneWay;
      binding.Source = this;
      BindingOperations.SetBinding( m_dragSourceManager, DragSourceManager.AutoScrollIntervalProperty, binding );

      binding = new Binding();
      binding.Path = new PropertyPath( "(0).(1)", DataGridControl.DataGridContextProperty, TableView.AutoScrollTresholdProperty );
      binding.Mode = BindingMode.OneWay;
      binding.Source = this;
      BindingOperations.SetBinding( m_dragSourceManager, DragSourceManager.AutoScrollTresholdProperty, binding );
    }
    private void RemoveDraggedColumnGhost( ColumnReorderingDragSourceManager manager )
    {
      if( !manager.ContainsDraggedColumnGhost( this ) )
        return;

      manager.RemoveDraggedColumnGhost( this );

      this.ClearValue( Cell.OpacityProperty );
    }
 internal virtual void SetColumnReorderingDragSourceManager( ColumnReorderingDragSourceManager value )
 {
   TableflowView.SetColumnReorderingDragSourceManager( this, value );
 }
    private void AddDraggedColumnGhost( ColumnReorderingDragSourceManager manager, bool isBeingDraggedAnimated )
    {
      if( !isBeingDraggedAnimated || !this.IsContainerPrepared || manager.ContainsDraggedColumnGhost( this ) )
        return;

      this.ClearValue( Cell.OpacityProperty );

      manager.AddDraggedColumnGhost( this );
    }