Добрый день! Сел осваивать drag&drop в WPF. Нашел неплохой пример: http://www.wpftutorial.net/DragAndDrop.html Итак, у меня есть коллекция объектов типа Dimension, внутри каждого находится другая коллекция объектов типа Measure. Написал следующий XAML:
<TreeView PreviewMouseLeftButtonDown="treeView1_PreviewMouseLeftButtonDown" PreviewMouseMove="treeView1_PreviewMouseMove">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type qb:Dimension}" ItemsSource="{Binding Measures}">
<TextBlock Margin="10,0,0,0" Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type qb:Measure}">
<TextBlock Margin="10,0,0,0" Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Далее, в соответствии с примером написал следующую функцию:
private void treeView1_PreviewMouseMove(object sender, MouseEventArgs e)
{
Point mousePos = e.GetPosition(null);
Vector diff = _DragStart - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
TreeView treeView = sender as TreeView;
TreeViewItem treeViewItem =
FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);
if (treeViewItem != null)
{
// если перетащить корневые элементы, то получаем, как и ожидалось, объект Dimension
// если перетащить элементы второго уровня, то здесь оказывается DependencyProperty.UnsetValue
object item = treeView.ItemContainerGenerator.
ItemFromContainer(treeViewItem);
if (item is Measure)
{
DataObject dragData = new DataObject("Measure", item);
DragDrop.DoDragDrop(treeViewItem, dragData, DragDropEffects.Move);
}
}
}
Выходит, что когда я пытаюсь перетащить элементы первого уровня (корневые), то в переменной item получаю соответствующий объект типа Dimension
. Но если попробовать перетянуть объект второго уровня, то в item лежит DependencyProperty.UnsetValue
. Подозреваю, что я криво забайндил, хотя визуально все хорошо.
Демо-проект находится тут: http://www.sendspace.com/file/l1rdw9