ListBox实现拖拽排序功能
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 = ""});
_persons.Add(new Person { Name = "test2", Order = "" });
_persons.Add(new Person { Name = "test3", Order = "" });
_persons.Add(new Person { Name = "test4", Order = "" });
_persons.Add(new Person { Name = "test5", Order = "" });
}
数据源
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实现拖拽排序功能的更多相关文章
- RecyclerViewItemTouchHelperDemo【使用ItemTouchHelper进行拖拽排序功能】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录使用ItemTouchHelper对Recyclerview进行拖拽排序功能的实现. 效果图 代码分析 ItemTouchHel ...
- php接口实现拖拽排序功能
列表拖拽排序是一个很常见的功能,但是后端接口如何处理却是一个令人纠结的问题 如何实现才能达到效率最高呢 先分析一个场景,假如有一个页面有十条数据,所谓的拖拽就是在这十条数据来来回回的拖,但是每次拖动都 ...
- vue列表拖拽排序功能实现
1.实现目标:目标是输入一个数组,生成一个列表:通过拖拽排序,拖拽结束后输出一个经过排序的数组. 2.实现思路: 2.1是使用HTML5的drag功能来实现,每次拖拽时直接操作Dom节点排序,拖拽结束 ...
- vue el-transfer新增拖拽排序功能---sortablejs插件
<template> <!-- target-order="unshift"必须设置,如果不设置的话后台穿的value值得顺序会被data重置 - --> ...
- vue2.0 不引用第三方包的情况下实现嵌套对象的拖拽排序功能
先上一张效果图,然后再上代码(由于只做效果,未做数据相关的处理:实际处理数据时不修改 dom 元素,只是利用 dom 元素传递数据,然后需改数据,靠数据驱动效果) <div :id=" ...
- ztree使用系列四(ztree实现同级拖拽排序并将排序结果保存数据库)
ztree这个系列的最后一篇,也是ztree功能强大的体现之中的一个--排序功能. ztree能够实现全部节点之间任意的拖拽排序功能.我这里依据须要实现了仅仅同意同级之间任意拖拽排序,事实上原理都一样 ...
- Sortable拖拽排序插件数据筛选
后台有拖拽排序功能,然而前段在开发的时候,一整页的数据都发给后端了. 于是查看前端代码,想到了如下解决办法,即先把排序前的保存,然后对比排序后的,有差异的才发回给后端. var new_ids_ord ...
- easyui树节点拖拽排序的存储过程
easyui树的拖拽排序功能 easyui树中有拖拽功能 树结构如下: 一个行政区域对应一个单位,一个单位对应多个部门,每个部门下有相关人员,功能要求: (1)行政区域没有子节点,点击text加载部门 ...
- vue中基于sortablejs与el-upload实现文件上传后拖拽排序
今天做冒烟测试的时候发现商品发布有一个拖拽图片排序功能没做,赶紧加上 之前别的同事基于 vuedraggable 实现过这个功能,我这里自己深度封装了 el-upload ,用这种方式改动很大,而且感 ...
随机推荐
- 新建一个Activity
如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.
- Android Dagger依赖注入框架浅析
今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...
- how to use javap command
SYNOPSIS javap [options] classes DESCRIPTION The javap command is called "disassembler" be ...
- 通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 解析办法
EasyRadius提示:通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 出现以上问题,和easyradius没有直接的联系,主要产生原因有两种可能: 可能1:easyr ...
- [GraphQL] Use Arguments in a GraphQL Query
In GraphQL, every field and nested object is able to take in arguments of varying types in order to ...
- Emit动态生成代码
Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...
- js多线程?
http://www.cnblogs.com/o--ok/archive/2012/11/04/JS.html http://blog.csdn.net/nx8823520/article/detai ...
- 自己做的加速app测试流程的小工具,目前打算开放使用,想注册的朋友抓紧了,嘻嘻
为了加速小团队app的测试流程做了这个东西,www.xunce.net 主要特性: web: 一键上传app,方便随时下载 备注测试要点 添加附件,如checklist等文档 自动识别app版本,名 ...
- VS2010 项目引用了微软企业库,但是编译时提示:未能找到类型或命名空间名称
我写的是控制台程序 是在引用我自己写的库 和 Microsoft.Practices.EnterpriseLibrary 时出现的问题 经过分析,和百度 找到了修改方法 打开 项目属性-->应 ...
- JIRA数据库切换(HSQL Database到MySQL)
没试过的版本,但是看着靠谱: 注:如果你之前配置过hsql版本,这次修改mysql数据操作会导致配置数据丢失,所以请注意备份 一. 创建名为jiradb的mysql数据,编码格式为utf-8 二.修改 ...