1、拖拽需要实现的事件包括:

PreviewMouseLeftButtonDown

LBoxSort_OnDrop

具体实现如下:

 private void LBoxSort_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e){var pos = e.GetPosition(LBoxSort);HitTestResult result = VisualTreeHelper.HitTest(LBoxSort, pos);if (result == null){return;}var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);if (listBoxItem == null || listBoxItem.Content != LBoxSort.SelectedItem){return;}DataObject dataObj = new DataObject(listBoxItem.Content as Person);DragDrop.DoDragDrop(LBoxSort, dataObj, DragDropEffects.Move);}private void LBoxSort_OnDrop(object sender, DragEventArgs e){var pos = e.GetPosition(LBoxSort);var result = VisualTreeHelper.HitTest(LBoxSort, pos);if (result == null){return;}//查找元数据var sourcePerson = e.Data.GetData(typeof (Person)) as Person;if (sourcePerson == null){return;}//查找目标数据var listBoxItem = Utils.FindVisualParent<ListBoxItem>(result.VisualHit);if (listBoxItem == null){return;}var targetPerson = listBoxItem.Content as Person;if (ReferenceEquals(targetPerson, sourcePerson)){return;}_persons.Remove(sourcePerson);_persons.Insert(_persons.IndexOf(targetPerson), sourcePerson);}}

事件实现

2、排序功能实现:
数据源:

private ObservableCollection<Person> _persons = new ObservableCollection<Person>();private void InitData(){_persons.Add(new Person{Name = "test1", Order = "1"});_persons.Add(new Person { Name = "test2", Order = "2" });_persons.Add(new Person { Name = "test3", Order = "3" });_persons.Add(new Person { Name = "test4", Order = "4" });_persons.Add(new Person { Name = "test5", Order = "5" });}

数据源

3、排序功能实现:
为数据集合实现CollectionChanged事件,当数据集合发生变化时执行:

  private void PersonsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e){if (e.Action == NotifyCollectionChangedAction.Remove){for (int i = e.OldStartingIndex; i < _persons.Count; i++){_persons[i].Order = i.ToString();}}else if (e.Action == NotifyCollectionChangedAction.Add){for (int i = e.NewStartingIndex; i < _persons.Count; i++){_persons[i].Order = i.ToString();}}}

排序

4、相关代码附加:

 public class Person : INotifyPropertyChanged{public string Name { get; set; }private string _order;public string Order{get { return _order; }set { _order = value; OnPropertyChanged("Order"); }}public event PropertyChangedEventHandler PropertyChanged;[NotifyPropertyChangedInvocator]protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChangedEventHandler handler = PropertyChanged;if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));}}internal static class Utils{//根据子元素查找父元素public static T FindVisualParent<T>(DependencyObject obj) where T : class{while (obj != null){if (obj is T)return obj as T;obj = VisualTreeHelper.GetParent(obj);}return null;}}

相关代码

5、代码下载地址:

http://download.csdn.net/detail/w_wanglei/6375371

ListBox实现拖拽排序功能相关推荐

  1. sortable vue 排序_vue 使用 sortable 实现 el-table 拖拽排序功能

    本文给大家介绍vue 使用 sortable 实现 el-table 拖拽排序功能,具体内容如下所示: npm 下载: npm install sortablejs --save 引入: import ...

  2. ListView和ListBox内部拖拽排序原理

    其实就是很简单的删除选定的元素,然后在合适的位置添加元素. 下面以listBox为例的代码: using System; using System.Collections.Generic; using ...

  3. element-ui table行列拖拽排序功能和解决列拖动数据不跟随改变的bug问题

    1.引入依赖 sortablejs npm install sortable.js --save 2.在mounted() 函数中分别引入两个自定义的方法 , 分别是行和列的拖动 贴一下这两个方法,拖 ...

  4. 微信小程序图片上传、多图拖拽排序功能

    基于movable-view实现的拖拽功能 可以建一个 dragImg的文件 wxml的代码 <view class="container"><movable-a ...

  5. html列表拖拽排序插件,JS拖拽排序插件Sortable.js用法实例分析

    本文实例讲述了JS拖拽排序插件Sortable.js用法.分享给大家供大家参考,具体如下: 最近由于项目功能设计的原因,需要对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好 ...

  6. 全网为数不多清晰可行的在VUE中使用sortable.js实现动态拖拽排序的教程!

    目录 0 写在前面的 1 依赖安装 2 手写简单标签演示 3 要点 4 效果 0 写在前面的 首先批评以下文章 (10条消息) sortable.js 实现拖拽_sortablejs_花铛的博客-CS ...

  7. RecyclerView长按拖拽排序 ,缩短长按响应时间,长按0.1秒就可以开始拖动

    RecyclerView长按拖拽排序 ,缩短长按响应时间,长按0.1秒就可以开始拖动 度娘搜索RecyclerView长按拖拽排序,很多文章讲解,没找到缩短长按响应时间的,所以自己研究了一下 先看效果 ...

  8. 基于movable-view的微信小程序拖拽排序(含源码)

    目录 一.前言与效果展示 二.源码 1.目录结构 2.drag.wxml文件 3.drag.wxss文件 (1)drag.less (2)drag.wxss  不会使用less的就用这个 4.drag ...

  9. html列表拖拽排序插件,可对列表自由拖拽排序的jQuery插件

    dragslot.js是一款可以对列表自由拖拽排序的jQuery插件.该插件主要的功能是实现了列表项可以在各个列表中相互拖拽. 对于像todo list, 分配任务列表都可以应用这个效果. 使用方法 ...

最新文章

  1. 浪潮刘军:为什么说计算力是AI时代“免费的午餐”?
  2. GitHub 高速上手 ---- 创建密钥,连接
  3. Exchange Server 2019新功能预览-揭秘被削减的功能
  4. Taro+react开发(90):列表渲染key值
  5. 江苏技术师范学院大学机房管理系统[.NET项目]
  6. 获取元素到页面上的位置
  7. python网络编程 赵宏_【干货收藏】Python面试指南大全
  8. 根据call/jmp操作数偏移检测内核是否被rootkit控制
  9. Windows Server 启用或关闭ping端口
  10. 机械电钢琴音源 Cinesamples Keyboard In Blue Kontakt
  11. 联想服务器ThinkServer网卡驱动程序缺失的解决办法
  12. 输入法变成繁体后改回简体中文
  13. Win11蓝牙耳机已连接电脑仍外放怎么解决
  14. IP网络摄像机安装注意事项
  15. 最全的PC【UA】UserAgent大全
  16. 毛远丽教授谈机器学习技术在检验医学中的新应用|专家论坛
  17. css3 实现图片闪过一道光效果 亲测可用
  18. 一些英文网站,字幕下载网站
  19. APP - APP监控软件,美团 24 小时不间断定位上热搜
  20. 什么是建筑中的“光储直柔”

热门文章

  1. FL的萌新之路,开始了!
  2. quartz CronExpression表达式
  3. linux日常管理-防火墙selinux
  4. ExecutionException异常
  5. Ruby中require,load,和include的区别
  6. qt中Qtableview的用法
  7. MFC+OPENCV+显示MAT类型图像
  8. C++ 包含目录、库目录、附加依赖项总结
  9. Android_安卓为按钮控件绑定事件的五种方式
  10. 静态方法和实例化方法的本质区别