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的更多相关文章

  1. WPF拖动DataGrid滚动条时内容混乱的解决方法

    WPF拖动DataGrid滚动条时内容混乱的解决方法 在WPF中,如果DataGrid里使用了模板列,当拖动滚动条时,往往会出现列表内容显示混乱的情况.解决方法就是在Binding的时候给Update ...

  2. 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

    原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH 在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向 ...

  3. wpf 获取datagrid中模板中控件

    //获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[].GetCellContent(dataGrid.Ite ...

  4. 在easyui datagrid中formatter数据后使用linkbutton

    http://ntzrj513.blog.163.com/blog/static/2794561220139245411997/ formatter:function(value,rowData,ro ...

  5. [WPF] 在 ViewModel 中让数据验证出错(Validation.HasError)的控件获得焦点

    1. 需求 在 MVVM 中 ViewModel 和 View 之间的交互通常都是靠 Icommand 和 INotifyPropertyChanged,不过有时候还会需要从 MVVM 中控制 Vie ...

  6. 在WPF的DataGrid中对行添加单击事件

    在做的一个c#的项目中发现Datagrid没办法直接对鼠标单击进行响应,调用MouseDown事件也需要点击某一行第二次才能响应.所以借助EventSetter来简单的实现了一个. 界面部分的代码 & ...

  7. wpf mvvm datagrid 中button绑定命令方法

    <DataGridTemplateColumn Header="设备状态" IsReadOnly="True" Width="150" ...

  8. WPF设置DataGrid行内容高度自适应 与 TextBox/TextBlock内容高度自适应

    WPF设置DataGrid行内容高度自适应  TextBox/TextBlock内容高度自适应  参考: DataGrid 控件中的调整大小选项: http://msdn.microsoft.com/ ...

  9. WPF 4 DataGrid 控件(基本功能篇)

    原文:WPF 4 DataGrid 控件(基本功能篇)      提到DataGrid 不管是网页还是应用程序开发都会频繁使用.通过它我们可以灵活的在行与列间显示各种数据.本篇将详细介绍WPF 4 中 ...

随机推荐

  1. java 编译中没有清除之前编译出来的文件。

    最近在写一个类时候使用了内部类,然后又将这个类改用普通类来实现.但在运行时访问局部变量时候出现了NullPointException异常,想来想去没有想明白,后来清除了一个之前编译出来的文件*.cla ...

  2. Transact-SQL的除法问题

    SELECT 3800/365, 3800.0/365; 执行上面的sql,得到的结果是:10, 10.410958 返回优先级较高的参数的数据类型. 有关详细信息,请参阅数据类型优先级 (Trans ...

  3. Python进阶06 循环对象

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循 ...

  4. Cocoa编程中视图控制器与视图类详解

    iPhone编程规则是:一个窗口,多个视图.UIView是iPhone屏幕上很多控件的基础类.每个iPhone用户界面都是由显示在UIWindow(这其实也是个特殊的UIView)内的众多UIView ...

  5. Redis链接上不的问题

    问题描述: 同样配置的redis及系统环境,在两台服务器(A.B两台服务)上部署,但是其中一台(A),运行一段时间,就链接不上了,从开始运行redis到redis链接不上,这个时间间隔,不一定有时候是 ...

  6. (easy)LeetCode 205.Reverse Linked List

    Reverse a singly linked list. 解法一:记录单链表每个节点的val,然后重新为单链表赋值.(取巧,仅仅是将val部分改变,原始node节点并没有改变) 代码如下: /** ...

  7. IntelliJ IDEA调整控制台输出字体大小

    File->Settings->Editor->Colors & Fonts->Console Font Size: 16

  8. (转)C#使用Mysql记录

    (1)首先需要下载C#访问MySQL数据库的ADO.NET驱动程序 http://dev.mysql.com/downloads/connector/ 我下载的版本为: mysql-connector ...

  9. Spark ThriftServer使用的大坑

    当用beeline连接default后,通过use xxx切换到其他数据库,再退出, 再次使用beeline -u jdbc:hive2://hadoop000:10000/default -n sp ...

  10. rlwrap(在sqlplus下使用上下键)

    一:安装readline OS的安装光盘里提供了readline包. # RHEL 4 [root@oracle11g ~]# rpm -Uvh readline* error: Failed dep ...