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