Avalonia DataGrid 不内置行拖拽排序,需手动实现:启用 AllowDrop、监听鼠标事件捕获拖动项、动态计算插入位置并更新 ObservableCollection,同时禁用默认选择避免冲突。
目前 Avalonia 官方 DataGrid(Avalonia.Controls.DataGrid)**不内置行拖拽排序功能**,也没有类似 WPF 中 AllowDrop + PreviewMouseMove + Drop 的开箱即用支持。但可通过事件拦截与手动逻辑实现——关键在于捕获鼠标拖动行为、动态更新数据源顺序,并配合视觉反馈提升体验。
必须先让 DataGrid 及其容器支持拖放交互:
Grid、Border)上设置 AllowDrop="True"
DragOver 和 Drop 事件,用于判断目标位置和执行插入ObservableCollection),否则无法实时刷新 UI不能依赖 DragDrop.DoDragDropAsync(那是用于跨控件/应用拖文件),而是监听鼠标按下+移动组合:
PointerPressed 事件中记录被点击的行索引(通过 e.GetCurrentPoint(dataGrid).Position + dataGrid.GetRowFromPoint(...) 或绑定项定位)_isDragging = true),并保存拖动项的数据对象在 PointerMoved 或 DragOver 中持续判断鼠标当前悬停在哪两行之间:
dataGrid.GetVisualChildren() 或缓存行高度估算),找到最接近的行间隙(例如:Y 落在第 i 行底部与第 i+1 行顶部之间)AdornerLayer 或临时 Border 在该间隙绘制插入指示线(如一条细横线或带
箭头的分隔条)在 Drop 或 PointerReleased 时执行最终逻辑:
ObservableCollection.Insert(targetIndex, item)
ICollectionView.Refresh() 确保排序/筛选状态一致(如果用了 CollectionViewSource)不复杂但容易忽略:拖动过程中需禁用 DataGrid 默认选择行为(如设置 SelectionMode="None" 或在拖动时临时取消选择),避免视觉冲突和逻辑干扰。