我们之前在DataGrid使用的第一部分中,使用到了拖拽事件,它能够实现用鼠标拖拽表格的行,对顺序进行重新排列,但是这个不够完善,当你在行中使用模板,添加了按钮,或者下拉框等控件的时候,对按钮的点击事件有影响,这里我们重新优化下代码。
之前我们是在鼠标移动的时候,如果左键按下,直接进入拖拽状态中,这就导致行中按钮的点击没办法执行,所以我们加一个判断,让鼠标移动一定的距离之后进入拖拽状态,可以避免此问题,另外,我们这里把鼠标事件写到datagridrow
上,下面是参考代码:
//datagrid.xaml
<DataGrid.Resource>
<Style TargetType="DataGridRow">
<Setter Property="AllowDrop" Value="True"></Setter>
<EventSetter Event="PreviewMouseLeftButtonDown" Handle="DataGridRow_PreviewMouseLeftButtonDown"></EventSetter>
<EventSetter Event="PreviewMouseMove" Handle="DataGridRow_PreviewMouseMove"></EventSetter>
<EventSetter Event="Drop" 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){
}
}