gpt4 book ai didi

c# - 由于 PreviewMouseLeftButtonDown,Datagrid 内的按钮未被触发

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:01 25 4
gpt4 key购买 nike

我正在开发 WPF 应用程序。

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

我正在使用数据网格的 “PreviewMouseLeftButtonDown”“Drop” 事件来实现拖放功能。

对于删除按钮,我绑定(bind)了删除命令。

Command="{Binding ElementName=viewName,Path=DataContext.DeleteCommand}" 

我也试过

 Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.DeleteCommand}" 

现在的问题是,当我单击“删除”按钮时,删除命令处理程序没有被触发。但是,如果我删除数据网格的“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 调用移动到数据网格的 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的教程- 这将使其他人更容易重现您遇到的问题。

关于c# - 由于 PreviewMouseLeftButtonDown,Datagrid 内的按钮未被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com