WPF拖动DataGrid中的数据到ListBox
1、效果图:

2、XAML
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
<ListBox Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="m_ListBox" VerticalAlignment="Top" Width="148" SelectionMode="Single" AllowDrop="True" Drop="m_ListBox_Drop" DragOver="m_ListBox_DragOver">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=Id, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding Path=Name, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Text="{Binding Path=ChildCount, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
<Button Content="展示" Tag="{Binding}" Name="m_ListBoxButton" Click="m_ListBoxButton_Click" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<DataGrid AutoGenerateColumns="False" Height="287" HorizontalAlignment="Left" Margin="181,12,0,0" Name="m_DataGrid" VerticalAlignment="Top" Width="299" AllowDrop="True" SelectionMode="Extended" PreviewMouseLeftButtonDown="m_DataGrid_PreviewMouseLeftButtonDown">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Id}" IsReadOnly="True" />
<DataGridTextColumn Binding="{Binding Name}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
3、CS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.ComponentModel; namespace WpfApplication2
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private ObservableCollection<Person> listBoxList = new ObservableCollection<Person>();
private Person m_SelectedListBoxPerson;
private Button m_SelectedListBoxButton; public MainWindow()
{
InitializeComponent();
} private void Window_Loaded(object sender, RoutedEventArgs e)
{
Person person = new Person() { Id = "", Name = "未分配" };
listBoxList.Add(person);
listBoxList.Add(new Person() { Id = "a1", Name = "a11" });
listBoxList.Add(new Person() { Id = "a2", Name = "a22" });
//初始化数据
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" });
person.Children.Add(new Person() { Id = "", Name = "" }); //控件加载数据
this.m_ListBox.ItemsSource = listBoxList;
}
private void m_DataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Point pos = e.GetPosition(m_DataGrid);
HitTestResult result = VisualTreeHelper.HitTest(m_DataGrid, pos);
DataGrid dataGrid = this.FindVisualParent<DataGrid>(result.VisualHit);
if (dataGrid == null || dataGrid.SelectedItems.Count <= )
{
return;
} List<Person> list = new List<Person>();
for (int i = ; i < dataGrid.SelectedItems.Count; i++)
{
if (dataGrid.SelectedItems[i] is Person)
{
list.Add(dataGrid.SelectedItems[i] as Person);
}
}
DragDrop.DoDragDrop(m_DataGrid, list, DragDropEffects.Move);
}
private void m_ListBox_Drop(object sender, DragEventArgs e)
{
Point pos = e.GetPosition(m_ListBox);
HitTestResult result = VisualTreeHelper.HitTest(m_ListBox, pos);
if (result == null)
{
return;
}
ListBox listBox = this.FindVisualParent<ListBox>(result.VisualHit);
if (listBox == null || listBox.SelectedItem == null)
{
return;
} List<Person> persons = e.Data.GetData(typeof(List<Person>)) as List<Person>;
if (persons != null)
{
foreach (var item in persons)
{
Person person = listBox.SelectedItem as Person;
person.Children.Add(item);
person.ChangeChildCount(); m_SelectedListBoxPerson.Children.Remove(item);
m_SelectedListBoxPerson.ChangeChildCount();
}
}
}
private void m_ListBox_DragOver(object sender, DragEventArgs e)
{
Point pos = e.GetPosition(m_ListBox);
HitTestResult result = VisualTreeHelper.HitTest(m_ListBox, pos);
if (result == null)
{
return;
}
ListBoxItem listBoxItem = this.FindVisualParent<ListBoxItem>(result.VisualHit);
if (listBoxItem == null || listBoxItem.Content == null || !(listBoxItem.Content is Person))
{
return;
} m_ListBox.SelectedItem = listBoxItem.Content;
m_ListBox.Focus();
}
private void m_ListBoxButton_Click(object sender, RoutedEventArgs e)
{
if (m_SelectedListBoxButton != null)
{
m_SelectedListBoxButton.IsEnabled = true;
m_SelectedListBoxButton.Content = "展示";
}
m_SelectedListBoxButton = sender as Button;
m_SelectedListBoxButton.Content = "待分配数据集合";
m_SelectedListBoxButton.IsEnabled = false;
m_ListBox.SelectedItem = m_SelectedListBoxButton.Tag;
m_ListBox.Focus();
m_SelectedListBoxPerson = m_ListBox.SelectedItem as Person;
this.m_DataGrid.ItemsSource = m_SelectedListBoxPerson.Children;
} private 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;
}
} class Person : INotifyPropertyChanged
{
public string Id { get; set; }
public string Name { get; set; }
public int ChildCount
{
get {
return this.Children.Count;
}
}
public ObservableCollection<Person> Children { get; set; }
public void ChangeChildCount()
{ this.Changed("ChildCount");
} public Person()
{
this.Children = new ObservableCollection<Person>();
} #region 属性更改通知
public event PropertyChangedEventHandler PropertyChanged;
private void Changed(string PropertyName)
{
if (this .PropertyChanged != null)
this.PropertyChanged(this , new PropertyChangedEventArgs(PropertyName));
}
#endregion
}
}
4、
WPF拖动DataGrid中的数据到ListBox的更多相关文章
- WPF拖动DataGrid滚动条时内容混乱的解决方法
WPF拖动DataGrid滚动条时内容混乱的解决方法 在WPF中,如果DataGrid里使用了模板列,当拖动滚动条时,往往会出现列表内容显示混乱的情况.解决方法就是在Binding的时候给Update ...
- 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH
原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH 在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向 ...
- wpf 获取datagrid中模板中控件
//获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[].GetCellContent(dataGrid.Ite ...
- 在easyui datagrid中formatter数据后使用linkbutton
http://ntzrj513.blog.163.com/blog/static/2794561220139245411997/ formatter:function(value,rowData,ro ...
- [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点
1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...
- 在WPF的DataGrid中对行添加单击事件
在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应,调用MouseDown事件也需要点击某一行第二次才能响应.所以借助EventSetter来简单的实现了一个. 界面部分的代码 & ...
- wpf mvvm datagrid 中button绑定命令方法
<DataGridTemplateColumn Header="设备状态" IsReadOnly="True" Width="150" ...
- WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应
WPF设置DataGrid行内容高度自适应 TextBox/TextBlock内容高度自适应 参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...
- WPF 4 DataGrid 控件(基本功能篇)
原文:WPF 4 DataGrid 控件(基本功能篇) 提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...
随机推荐
- 开发工具及服务年度大奖评选 I Bugtags 荣获最具成长潜力奖
作为全球最大中文 IT 社区和服务平台.中国最大技术管理者平台的 CSDN 在中国北京总部举办了一场 2015 年开发工具及服务年度大奖评选活动,此次活动目的在于推动开发服务及工具质量的提升,提高行业 ...
- Bootstrap学习的点点滴滴
1)网站:http://www.bootcss.com/http://v3.bootcss.com/getting-started/#downloadhttps://github.com/twbs/b ...
- 朗逸2011款 1.4t 清除保养告警灯
朗逸2011款 1.4t 清除保养告警灯 Posted on 2015-03-01 21:06 编辑 仪表盘上有两个按钮 按住右边set键,钥匙旋转到通电状态,保持2s. 放掉set,按左边的切换按钮 ...
- gomoblie flappy 源码分析:图片素材和大小的处理
flappy的源码可以在 https://github.com/golang/mobile 看到.具体在 https://github.com/golang/mobile/tree/master/ex ...
- C# 文件压缩与解压(ZIP格式)
在企业开发过程中经常会遇到文件的压缩与解压,虽然网上很多流行的压缩文件格式都是RAR的,但是由于RAR不是一个开放的标准,因此ZIP成了更多人的选择.如果你不想自己开发的话可以选择开源的项目,比如Sh ...
- Mingyang.net:No identifier specified for entity
org.hibernate.AnnotationException: No identifier specified for entity: net.mingyang.modules.system.C ...
- 第二章 I - The 3n + 1 problem(2.4.2)
这是一道很坑爹的题,一定注意输入的两个数的大小,并且不能简单的交换,因为在最后的输出的时候还需要将原来的数按照原来的顺序和大小,这就是为什么还得开辟两个值得原因 Description Problem ...
- ASP.NET MVC开发微信(二)
- H264句法和语法总结(二)NAL层语法
1.NAL全称Network Abstract Layer, 即网络抽象层. 在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(N ...
- JAVA中求解对象所占字节大小
该类为cache4j缓存框架中的工具类方法,该方法实现了两个接口 接口1:计算对象在内存中所占字节数 接口2:复制对象,实现深度克隆效果,实现原理为先序列化对象,然后在反序列化对象:返回一个新的对象, ...