2011-01-05 84 views
5

我正在使用WPF DataGrid。我必須拖動列標題,將其放到其他控件(比如標籤)並執行一些操作。但我無法實現DataGrid列標題的拖放。我嘗試過使用ColumnHeaderDragStarted事件,但我無法在處理程序中找到Column Header對象或只是名稱的標題。 任何幫助PLZ!如何拖放DataGrid列標題?

回答

4

也許這可以幫助你:

在XAML:

< DataGrid的名稱= 「數據網格」 的MouseRightButtonUp = 「DataGrid_MouseRightButtonUp」/ >

在C#代碼:

private void DataGrid_MouseRightButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     DependencyObject dep = (DependencyObject)e.OriginalSource; 

     while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 

     if (dep == null) 
      return; 

     if (dep is DataGridColumnHeader) 
     { 
      DataGridColumnHeader columnHeader = dep as DataGridColumnHeader; 

      // find the property that this cell's column is bound to 
      string boundPropertyName = FindBoundProperty(columnHeader.Column); 

      int columnIndex = columnHeader.Column.DisplayIndex; 

      ClickedItemDisplay.Text = string.Format(
       "Header clicked [{0}] = {1}", 
       columnIndex, boundPropertyName); 
     } 

     if (dep is DataGridCell) 
     { 
      DataGridCell cell = dep as DataGridCell; 

      // navigate further up the tree 
      while ((dep != null) && !(dep is DataGridRow)) 
      { 
       dep = VisualTreeHelper.GetParent(dep); 
      } 

      if (dep == null) 
       return; 

      DataGridRow row = dep as DataGridRow; 

      object value = ExtractBoundValue(row, cell); 

      int columnIndex = cell.Column.DisplayIndex; 
      int rowIndex = FindRowIndex(row); 

      ClickedItemDisplay.Text = string.Format(
       "Cell clicked [{0}, {1}] = {2}", 
       rowIndex, columnIndex, value.ToString()); 
     } 
    } 

    /// <summary> 
    /// Determine the index of a DataGridRow 
    /// </summary> 
    /// <param name="row"></param> 
    /// <returns></returns> 
    private int FindRowIndex(DataGridRow row) 
    { 
     DataGrid dataGrid = ItemsControl.ItemsControlFromItemContainer(row) as DataGrid; 

     int index = dataGrid.ItemContainerGenerator.IndexFromContainer(row); 

     return index; 
    } 

    /// <summary> 
    /// Find the value that is bound to a DataGridCell 
    /// </summary> 
    /// <param name="row"></param> 
    /// <param name="cell"></param> 
    /// <returns></returns> 
    private object ExtractBoundValue(DataGridRow row, DataGridCell cell) 
    { 
     // find the property that this cell's column is bound to 
     string boundPropertyName = FindBoundProperty(cell.Column); 

     // find the object that is realted to this row 
     object data = row.Item; 

     // extract the property value 
     PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(data); 
     PropertyDescriptor property = properties[boundPropertyName]; 
     object value = property.GetValue(data); 

     return value; 
    } 

    /// <summary> 
    /// Find the name of the property which is bound to the given column 
    /// </summary> 
    /// <param name="col"></param> 
    /// <returns></returns> 
    private string FindBoundProperty(DataGridColumn col) 
    { 
     DataGridBoundColumn boundColumn = col as DataGridBoundColumn; 

     // find the property that this column is bound to 
     Binding binding = boundColumn.Binding as Binding; 
     string boundPropertyName = binding.Path.Path; 

     return boundPropertyName; 
    } 
} 

// This XAML and C# where extracted from a link contained on this URL:  
// http://social.msdn.microsoft.com/Forums/en/wpf/thread/61707b8a-e6c6-474b-ac2b-3446319625bd