Wpf Datagrid拖放到组将禁用排序
我有一个WPF Datagrid,其中添加了将列标题拖动到列表框的功能,以便根据以前的帖子进行分组。我遇到的一个问题是,当调用DoDragDrop函数时,它会禁用Datagrid的单击排序功能。有没有办法将列标题拖放到组中,但仍然可以单击进行排序Wpf Datagrid拖放到组将禁用排序,wpf,sorting,datagrid,columnheader,Wpf,Sorting,Datagrid,Columnheader,我有一个WPF Datagrid,其中添加了将列标题拖动到列表框的功能,以便根据以前的帖子进行分组。我遇到的一个问题是,当调用DoDragDrop函数时,它会禁用Datagrid的单击排序功能。有没有办法将列标题拖放到组中,但仍然可以单击进行排序 private void DataGridHeader_PreviewMouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Press
private void DataGridHeader_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
var header = e.OriginalSource as ContentControl;
if (header != null)
{
DragDrop.DoDragDrop(header, new DataObject(typeof(string), header.Content.ToString()), DragDropEffects.Move);
e.Handled = true;
}
}
}
private void ListBox_Drop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(string)))
{
var columnName = (string)e.Data.GetData(typeof(string));
this.GroupedColumns.Add(columnName);
var sourceView = CollectionViewSource.GetDefaultView(this.DataGrid.ItemsSource);
sourceView.GroupDescriptions.Add(new PropertyGroupDescription(columnName));
sourceView.Refresh();
e.Handled = true;
}
}
我正在通过XAML关注这些事件
ListBox Name="HeaderListBox" VerticalContentAlignment="Center" ItemsSource="{Binding GroupedColumns}" AllowDrop="True" Margin="5" Drop="ListBox_Drop"
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<EventSetter Event="PreviewMouseMove" Handler="DataGridHeader_PreviewMouseMove"/>
</Style>
</DataGrid.ColumnHeaderStyle>
ListBox Name=“HeaderListBox”VerticalContentAlignment=“Center”ItemsSource=“{Binding GroupedColumns}”AllowDrop=“True”Margin=“5”Drop=“ListBox\u Drop”
我可以通过保存鼠标左下的位置,然后签入鼠标移动处理程序来解决此问题:
private void DataGridHeader_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
columnDragDropStartPoint = e.GetPosition(null);
}
public void DataGridHeader_PreviewMouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
Point mousePos = e.GetPosition(null);
Vector diff = columnDragDropStartPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
(Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance))
{
var header = e.Source as DataGridColumnHeader;
if (header != null)
{
DragDrop.DoDragDrop(header, new DataObject(typeof(string[]), new[] { header.Column.SortMemberPath.ToString(), header.Content.ToString() }), DragDropEffects.Move);
e.Handled = true;
}
}
}
您应该添加一些代码来显示您所尝试的内容在列定义中添加SortMemberPath可能会修复它,但我不能确定,因为您可能没有显式定义列或其他一些可能的问题。我的代码实现了DataGridHeader\u PreviewMouseMove和ListBox\u Drop方法调用,如我在描述中的链接所示。分组工作得很好,但当我单击列标题时,它会禁用排序。我不是在定义列,而是在设置DataGrid.ItemsSource=DataTable.AsDataView()并自动生成列。