I made a demo to drag and drop from ListBox into TreeView for you.
xaml code:
<StackPanel Width="800" Height="600">
<TreeView Width="600" Height="300" Name="tvParameters" AllowDrop="True" Background="PowderBlue" Foreground="DarkBlue" FontSize="15" >
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItem}" ItemsSource="{Binding Items,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<TextBlock Text="{Binding Title ,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="TreeViewItem.Drop" Handler="treeView_Drop"/>
<Setter Property="IsExpanded" Value="True"></Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
<ListBox Name="lb" Width="200" Height="200" SelectionMode="Single" PreviewMouseLeftButtonDown="ListBox_PreviewMouseLeftButtonDown"
ItemsSource="{Binding ListBoxItems,UpdateSourceTrigger=PropertyChanged}">
</ListBox>
</StackPanel>
C# code:
public partial class Window2 : Window
{
ViewModel viewModel = new ViewModel();
TreeViewItem draggedItem;
public Window2()
{
InitializeComponent();
this.tvParameters.Items.Add(viewModel.TreeViewItems);
lb.ItemsSource = viewModel.ListBoxItems;
}
private void treeView_Drop(object sender, DragEventArgs e)
{
try
{
e.Effects = DragDropEffects.None;
e.Handled = true;
draggedItem = new TreeViewItem() { Header = mydata };
TreeViewItem TargetItem = GetNearestContainer(e.OriginalSource as UIElement);
if (TargetItem != null && draggedItem != null)
{
e.Effects = DragDropEffects.Move;
MenuItem original = viewModel.TreeViewItems;
MenuItem target = (MenuItem)TargetItem.Header;
if (target.Title == original.Title)
{
target.Level = original.Level;
}
else
{
CheckInTree(target, original.Items);
}
MenuItem draggedMeun = new MenuItem() { Items = null, Title = mydata.ToString() };
addChild(draggedMeun, target);
viewModel.ListBoxItems.Remove(mydata.ToString());
lb.ItemsSource = viewModel.ListBoxItems;
}
}
catch (Exception)
{
}
}
private MenuItem CheckInTree(MenuItem target, ObservableCollection<MenuItem> originalItems)
{
MenuItem newtarget = originalItems.Where(m => m.Title == target.Title).FirstOrDefault();
if (originalItems.Count != 0 && newtarget == null)
{
foreach (MenuItem menu in originalItems)
{
ObservableCollection<MenuItem> menus = new ObservableCollection<MenuItem>();
menus = menu.Items;
CheckInTree(target, menus);
}
}
return newtarget;
}
public void addChild(MenuItem _sourceItem, MenuItem _targetItem)
{
if (_targetItem == null) return;
MenuItem item1 = new MenuItem();
item1.Title = _sourceItem.Title;
_targetItem.Items.Add(item1);
if (_sourceItem.Items != null)
{
foreach (MenuItem item in _sourceItem.Items)
{
addChild(item, item1);
}
}
}
ListBox dragSource = null;
object mydata;
private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListBox parent = (ListBox)sender;
dragSource = parent;
mydata = GetDataFromListBox(dragSource, e.GetPosition(parent));
if (mydata != null)
{
DragDrop.DoDragDrop(parent, mydata, DragDropEffects.Move);
}
}
private static object GetDataFromListBox(ListBox source, Point point)
{
UIElement element = source.InputHitTest(point) as UIElement;
if (element != null)
{
object data = DependencyProperty.UnsetValue;
while (data == DependencyProperty.UnsetValue)
{
data = source.ItemContainerGenerator.ItemFromContainer(element);
if (data == DependencyProperty.UnsetValue)
{
element = VisualTreeHelper.GetParent(element) as UIElement;
}
if (element == source)
{
return null;
}
}
if (data != DependencyProperty.UnsetValue)
{
return data;
}
}
return null;
}
private TreeViewItem GetNearestContainer(UIElement element)
{
TreeViewItem container = element as TreeViewItem;
while ((container == null) && (element != null))
{
element = VisualTreeHelper.GetParent(element) as UIElement;
container = element as TreeViewItem;
}
return container;
}
}
public class ViewModel : NotifyObject
{
public ViewModel()
{
this.ListBoxItems.Add("Fruit Ninja");
this.ListBoxItems.Add("Opera Browser");
this.ListBoxItems.Add("Notepad");
this.ListBoxItems.Add("Apple");
this.ListBoxItems.Add("Orange");
TreeViewItems = new MenuItem() { Title = "Menu",Level="0" };
MenuItem childItem1 = new MenuItem() { Title = "1", Level = "1" };
childItem1.Items.Add(new MenuItem() { Title = "#1.1",Level="2" });
childItem1.Items.Add(new MenuItem() { Title = "#1.2", Level = "2" });
TreeViewItems.Items.Add(childItem1);
TreeViewItems.Items.Add(new MenuItem() { Title = "2" ,Level = "1" });
}
public ObservableCollection<string> ListBoxItems = new ObservableCollection<string>();
public MenuItem tireeViewItems = new MenuItem();
public MenuItem TreeViewItems
{
get { return tireeViewItems; }
set
{
tireeViewItems = value;
OnPropertyChange("TreeViewItems");
}
}
}
public class MenuItem: NotifyObject
{
private string level;
public string Level
{
get { return level; }
set
{
level = value;
OnPropertyChange("Level");
}
}
private string title;
public string Title
{
get { return title; }
set
{
title = value;
OnPropertyChange("Title");
}
}
private ObservableCollection<MenuItem> items = new ObservableCollection<MenuItem>();
public ObservableCollection<MenuItem> Items
{
get { return items; }
set
{
items = value;
OnPropertyChange("Items");
}
}
}
public class NotifyObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChange(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
The result picture:
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.