C# WPF实现两个ListBox之间Item的拖动
By
jerryxjr1220
at 2023-10-23 • 0人收藏 • 524人看过
<hc:GlowWindow x:Class="WPFDragItem.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:WPFDragItem.ViewModels"
xmlns:hc="https://handyorg.github.io/handycontrol"
d:DataContext="{d:DesignInstance Type=vm:MainViewModel}"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
FontFamily="JetBrains Mono"
FontSize="{StaticResource TextFontSize}">
<Window.Resources>
</Window.Resources>
<hc:SimplePanel>
<ScrollViewer x:Name="scrollViewer" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ListBox Grid.Column="0" ItemsSource="{Binding List1}" AllowDrop="True"
PreviewMouseLeftButtonDown="ListBox_OnPreviewMouseLeftButtonDown" Drop="Listbox_OnDrop" />
<ListBox Grid.Column="1" ItemsSource="{Binding List2}" AllowDrop="True" Drop="Listbox_OnDrop"
PreviewMouseLeftButtonDown="ListBox_OnPreviewMouseLeftButtonDown" />
</Grid>
</ScrollViewer>
</hc:SimplePanel>
</hc:GlowWindow>using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using HandyControl.Controls;
using WPFDragItem.ViewModels;
namespace WPFDragItem.Views;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : GlowWindow
{
private readonly MainViewModel mainViewModel;
public MainWindow()
{
InitializeComponent();
#region 注册并接受消息
//WeakReferenceMessenger.Default.Register<CustomizedMessage>(this, (o, m) => { MessageBox.Show("Received!"); });
#endregion
mainViewModel = new MainViewModel();
DataContext = mainViewModel;
}
private void Listbox_OnDrop(object sender, DragEventArgs e)
{
var data = e.Data.GetData(typeof(string));
if (mainViewModel.List1.Contains(data as string))
{
mainViewModel.List1.Remove(data as string);
mainViewModel.List2.Add(data as string);
}
else if (mainViewModel.List2.Contains(data as string))
{
mainViewModel.List1.Add(data as string);
mainViewModel.List2.Remove(data as string);
}
}
private void ListBox_OnPreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
try
{
var parent = (ListBox)sender;
var data = parent.SelectedItems[0];
DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
}
catch (Exception)
{
//ignored
}
}
}using System.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;
namespace WPFDragItem.ViewModels;
public partial class MainViewModel : ObservableObject
{
[ObservableProperty] private BindingList<string> _list1;
[ObservableProperty] private BindingList<string> _list2;
public MainViewModel()
{
List1 = new BindingList<string> { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
List2 = new BindingList<string> { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" };
//发送消息
//WeakReferenceMessenger.Default.Send(new CustomizedMessage(new MessageModel()));
}
}
//定义消息
// public class CustomizedMessage : ValueChangedMessage<MessageModel> // PropertyChangedMessage // RequestMessage ( Async + ..)
// {
// public CustomizedMessage(MessageModel value) : base(value)
// {
// }
// }登录后方可回帖