Для проекта, над которым я работаю, мне нужно было создать древовидную структуру с изменением порядка перетаскивания.Прежде чем связываться с реальным проектом, я вложил в дерево подклассы отдельный проект и добавил обработчики для событий Drop, DragOver, MouseMove и DragLeave и реализовал их по мере необходимости.Перетаскивание с помощью перетаскивания работает отлично для побочного проекта, потому что я настроил его так, что каждый TreeViewItem хранит интересующий меня элемент в свойстве Header.
Вот часть кода:
void MultiSelectTreeView_Drop(object sender, System.Windows.DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(TreeViewItem)))
{
TreeViewItem sourceItem = (TreeViewItem)e.Data.GetData(typeof(TreeViewItem));
TreeViewItem targetItem = e.Source as TreeViewItem;
dynamic parent;
if (targetItem == null) //not dropped in the treeview
{
_isDragging = false;
return;
}
else if (targetItem.Parent is TreeViewItem) //drag must start from either a treeviewitem...
{
parent = targetItem.Parent as TreeViewItem;
}
else // ... or the root treeview
{
parent = targetItem.Parent as TreeView;
}
//Complete the drag/drop
//must be same parent to successfully drop
if(sourceItem.Parent == targetItem.Parent)
{
var indexOfDropTarget = parent.Items.IndexOf(targetItem);
parent.Items.RemoveAt(parent.Items.IndexOf(sourceItem));
parent.Items.Insert(indexOfDropTarget, sourceItem);
sourceItem.IsSelected = true;
}
}
_isDragging = false;
}
Правила древовидного представления, которые мне нужны, состоят в том, что элемент, который отбрасывается для переупорядочения, может быть переупорядочен только в пределах одного и того же родителя.
Приведенный выше код прекрасно работает при условии, что все дочерние элементы древовидных представлений являются древовиднымиэлементы, каждый из которых содержит интересующую меня структуру данных.
При перемещении моего нового класса древовидной структуры в более крупный проект я заметил, что, поскольку древовидное представление привязано к коллекции в модели представления, e.Dataбольше не является элементом дерева!Теперь это структура данных из модели представления.e.Source также больше не является элементом древовидного списка, он представляет собой весь древовидный список, поэтому я не могу сказать, куда я «сбрасываю» элемент.
Древовидное представление создается автоматически на основе структуры данных в представлении.модель.Каждый элемент имеет свойство Children, а каждый элемент в свойстве Children может иметь своих детей.Мое требование заключается в том, что элементы в свойстве Children можно переупорядочить, но нельзя переместить ребенка в ту же коллекцию, в которой хранится его родитель, или в одну из коллекций его детей.
Мой вопрос заключается в следующем: какполучить перетаскиваемый TreeViewItem и перетаскиваемый TreeViewItem?Мне нужно иметь возможность видеть родителей каждого из них и убедиться, что они одинаковы.
Я поступаю неправильно?Должен ли я вместо этого передавать команды обратно в модель представления?
Спасибо!