我正在处理WPF应用程序。
根据要求,我想在数据网格中显示项目列表。每行都有一个“删除”按钮,使用此按钮我们可以删除相应的项目。
我还需要网格的拖放功能。也就是说,用户可以上下移动行。
我正在使用datagrid的“PreviewMouseLeftButtonDown”
和“Drop”
事件来实现拖放功能。
对于DELETE按钮,我绑定了Delete命令。
Command="{Binding ElementName=viewName,Path=DataContext.DeleteCommand}"
我也试过
Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DeleteCommand}"
现在的问题是,当我单击“ DELETE”按钮时,删除命令处理程序未触发。但是,如果删除数据网格的“ PreviewMouseLeftButtonDown”和“ Drop”事件,则删除命令处理程序将正常运行。
我还注意到,即使添加了PreviewMouseLeftButtonDown事件后,即使注释了“ PreviewMouseLeftButtonDown”中的所有代码,它也会阻止Delete命令处理程序的执行。
<DataGridTemplateColumn Width="35" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Width="30" Content="X" Command="{Binding ElementName=viewCSW,Path=DataContext.DeleteCommand}" HorizontalAlignment="Center" Margin="0,0,0,0" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Height" Value="25"/>
</Style>
</DataGrid.RowStyle>
PreviewMousedown代码
private void dgEmployee_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
prevRowIndex = GetDataGridItemCurrentRowIndex(e.GetPosition);
if (prevRowIndex < 0)
return;
dgEmployee.SelectedIndex = prevRowIndex;
var selectedEmployee = dgEmployee.Items[prevRowIndex];//as Employee;
if (selectedEmployee == null)
return;
//Now Create a Drag Rectangle with Mouse Drag-Effect
//Here you can select the Effect as per your choice
DragDropEffects dragdropeffects = DragDropEffects.Move;
if (DragDrop.DoDragDrop(dgEmployee, selectedEmployee, dragdropeffects)
!= DragDropEffects.None)
{
//Now This Item will be dropped at new location and so the new Selected Item
dgEmployee.SelectedItem = selectedEmployee;
}
// sourceElement.CaptureMouse();
// return;
}
我正在努力解决这个问题。
如果有任何解决方案,请告诉我。
谢谢,
提纯
最佳答案
将DragDrop.DoDragDrop
调用移至datagrid的MouseMove
事件:
private void dgEmployee_MouseMove(object sender, MouseEventArgs e)
{
if(e.LeftButton == MouseButtonState.Pressed)
{
Employee selectedEmp = dgEmployee.Items[prevRowIndex] as Employee;
if (selectedEmp == null)
return;
DragDropEffects dragdropeffects = DragDropEffects.Move;
if (DragDrop.DoDragDrop(dgEmployee, selectedEmp, dragdropeffects)
!= DragDropEffects.None)
{
//Now This Item will be dropped at new location and so the new Selected Item
dgEmployee.SelectedItem = selectedEmp;
}
}
}
更新的
PreviewMouseLeftButtonDown
处理程序:void dgEmployee_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
prevRowIndex = GetDataGridItemCurrentRowIndex(e.GetPosition);
if (prevRowIndex < 0)
return;
dgEmployee.SelectedIndex = prevRowIndex;
}
它不仅可以解决您的问题,而且可以提供更好的用户体验。当我移动鼠标时,而不是在按行时,应该启动拖动。
下次,请链接教程you are using-这将使其他人更轻松地重现您遇到的问题。