• 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 = "01", 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 = "1", Name = "001" });
                person.Children.Add(new Person() { Id = "2", Name = "002" });
                person.Children.Add(new Person() { Id = "3", Name = "003" });
                person.Children.Add(new Person() { Id = "4", Name = "004" });
                person.Children.Add(new Person() { Id = "5", Name = "005" });
                person.Children.Add(new Person() { Id = "6", Name = "006" });
                person.Children.Add(new Person() { Id = "7", Name = "007" });
                person.Children.Add(new Person() { Id = "8", Name = "008" });
                person.Children.Add(new Person() { Id = "9", Name = "009" });
                person.Children.Add(new Person() { Id = "10", Name = "010" });
    
                //控件加载数据
                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 <= 0)
                {
                    return;
                }
    
                List<Person> list = new List<Person>();
                for (int i = 0; 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、

  • 相关阅读:
    TCP带外数据
    ASP.Net Core 返回的json数据,自定义日期格式
    C# 简单的区块链实现
    PowerShell自动部署ASP.NET Core程序到 IIS
    ASP.NET Core依赖注入多个服务实现类
    EF Core 2.0 执行原始查询如何防止SQL注入
    C#7 进入快速迭代道路
    QuartzNet 任务管理系统
    WebApi如何传递参数
    C# 快速高效率复制对象另一种方式 表达式树
  • 原文地址:https://www.cnblogs.com/sshoub/p/4602400.html
Copyright © 2020-2023  润新知