我们之前在DataGrid使用的第一部分中,使用到了拖拽事件,它能够实现用鼠标拖拽表格的行,对顺序进行重新排列,但是这个不够完善,当你在行中使用模板,添加了按钮,或者下拉框等控件的时候,对按钮的点击事件有影响,这里我们重新优化下代码。
之前我们是在鼠标移动的时候,如果左键按下,直接进入拖拽状态中,这就导致行中按钮的点击没办法执行,所以我们加一个判断,让鼠标移动一定的距离之后进入拖拽状态,可以避免此问题,另外,我们这里把鼠标事件写到datagridrow
上,下面是参考代码:
//datagrid.xaml <DataGrid.Resource> <Style TargetType="DataGridRow"> <Setter Property="AllowDrop" Value="True"></Setter> <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseLeftButtonDown"></EventSetter> <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseMove"></EventSetter> <EventSetter Property="PreviewMouseLeftButtonDown" Handle="DataGridRow_Drop"></EventSetter> </Style> </DataGrid.Resource>
//datagrid.xaml.cs private DataGridRow _draggedItem; private Point _startPoint; private void DataGridRow_PreviewMouseLeftButtonDown(object sender,MouseButtonEventArgs e){ //记录鼠标开始的位置 _startPoint=e.GetPosition(this); } private void DataGridRow_PreviewMouseMove(object sender,MouseEventArgs e){ try{ if(e.leftButton==MouseButtonState.Pressed){ //判断鼠标移动的位置大于某个值进入拖拽状态 Point endPoint=e.GetPosition(this); if(Math.Abs(endPoint.Y-_startPoint.Y)>5){ if(sender is DataGridRow){ _draggedItem=(sender as DataGridRow); DragDrop.DoDragDrop(_draggedItem,_draggedItem.DataContext,DragDropEffects.Move); _draggedItem.IsSelected=true; } } } } catch(Exception ex){ } } private void DataGridRow_Drop(object sender,DragEventArgs e){ try{ if(sender is DataGridRow){ DataGridRow targetRow=sender as DataGridRow; int preIndex=_draggedItem.GetIndex(); int index=targetRow.GetIndex(); //datagrid绑定的数据源 ObservableCollection<BindingModel> items=(this.DataContext as viewModel).bindingItems; if(index>items.Count-1) return; BindingModel item=null; for(int i=0;i<items.Count;i++){ if(i==preIndex){ item=item[i]; } } if(item!=null){ items.RemoveAt(preIndex); items.Insert(index,item); } } } catch(Exception ex){ } }