由于PreviewMouseLeftButtonDown,数据网格内的按钮未被激发

本文关键字:按钮 PreviewMouseLeftButtonDown 数据 数据网 网格 由于 | 更新日期: 2023-09-27 18:25:28

我正在开发一个WPF应用程序。

根据要求,我想在数据网格中显示项目列表。每一行也有一个"DELETE"按钮,使用这个按钮我们可以删除相应的项目。我还想要网格的拖放功能。也就是说,用户可以向上/向下移动行。

我使用数据网格的“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"answers"Drop"事件,删除命令处理程序将完美工作。

我还注意到,即使在添加PreviewMouseLeftButtonDown事件后对"PreviewMousLeftButtondown"内的所有代码进行了注释,它也会阻止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>

鼠标悬停预览代码

  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;
        }

我正在努力解决这个问题。

如果有人有解决方案,请告诉我。

谢谢,Ranish

由于PreviewMouseLeftButtonDown,数据网格内的按钮未被激发

DragDrop.DoDragDrop调用移动到数据网格的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;
    }

它不仅能解决您的问题,还能提供更好的用户体验。拖动应该在我移动鼠标时启动,而不是在我按行时启动。

下次请链接您正在使用的教程-这将使其他人更容易重现您遇到的问题。