C# 将DataGrid列标题拖到标签上?

C# 将DataGrid列标题拖到标签上?,c#,wpf,datagrid,drag-and-drop,C#,Wpf,Datagrid,Drag And Drop,我想在列标题上方的现有WPF数据网格中添加一个放置区域。在该区域中,我希望允许用户删除表示要分组的列的列标题,并通过从该区域中删除这些列来取消这些列的分组。我无法拖动瓷砖,然后将其放到标签上。我的方法是将MouseMove和MouseLeftButtonDown组合起来检测阻力,但它不起作用。示例代码: DataTable dt = new DataTable(); dt.Columns.Add("Table", typeof(string));

我想在列标题上方的现有WPF数据网格中添加一个放置区域。在该区域中,我希望允许用户删除表示要分组的列的列标题,并通过从该区域中删除这些列来取消这些列的分组。我无法拖动瓷砖,然后将其放到标签上。我的方法是将MouseMove和MouseLeftButtonDown组合起来检测阻力,但它不起作用。示例代码:

    DataTable dt = new DataTable();
            dt.Columns.Add("Table", typeof(string));
            dt.Columns.Add("Scan Count", typeof(string));                
             DataRow dr = dt.NewRow();
            dr["Scan Count"] = sum.ToString();
            dr["logical reads"] = sum1.ToString();

 private void Button_Click(object sender, RoutedEventArgs e)
            {
                ICollectionView cvTasks = CollectionViewSource.GetDefaultView(GridView1.ItemsSource);
                if (cvTasks != null && cvTasks.CanGroup == true)
                {
                    cvTasks.GroupDescriptions.Clear();
                    cvTasks.GroupDescriptions.Add(new PropertyGroupDescription("Table"));                        
                }
            }
public class Tasks : ObservableCollection<Task>
    {
        //Creating the Tasks collection in this way enables data binding from XAML.            
    }

我想删除此按钮并将列名表拖放到标签上。欢迎提出任何建议。谢谢

你应该做的最少的事情:

1重新设置DataGridColumnHeader的样式以添加PreviewMouseMove事件处理程序。 2在事件处理程序中,启动拖放操作。 3将GroupStyle添加到DataGrid。 4对于作为drop目标的元素,处理drop事件并更新GroupDescriptions

XAML:


取消分组也是类似的。

您应该做的最低限度的事情:

1重新设置DataGridColumnHeader的样式以添加PreviewMouseMove事件处理程序。 2在事件处理程序中,启动拖放操作。 3将GroupStyle添加到DataGrid。 4对于作为drop目标的元素,处理drop事件并更新GroupDescriptions

XAML:

联合国分组也是如此

<Grid>        
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <ListBox x:Name="MyGroupDescriptionsList" AllowDrop="True" Drop="ListBox_Drop"/>

    <DataGrid x:Name="MyDataGrid" Grid.Row="1" ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <EventSetter Event="PreviewMouseMove" Handler="DataGridHeader_PreviewMouseMove"/>
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True" Header="{Binding Name}">
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Header="A" Binding="{Binding A}"/>
            <DataGridTextColumn Header="B" Binding="{Binding B}"/>
            <DataGridTextColumn Header="C" Binding="{Binding C}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
    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));

            MyGroupDescriptionsList.Items.Add(columnName);

            var sourceView = CollectionViewSource.GetDefaultView(MyDataGrid.ItemsSource);
            sourceView.GroupDescriptions.Add(new PropertyGroupDescription(columnName));
            sourceView.Refresh();

            e.Handled = true;
        }
    }