Задача, сделать возможность для перетаскивания элемента из ListView в TreeView и обратно. Получается только перетащить выделенный текст из TextBox в TreeView только как новый узел.
<TreeView ItemsSource="{Binding TreeCollection}" AllowDrop="True">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding ChildTree}">
<TextBlock Text="{Binding Text}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Drop">
<cmd:EventToCommand Command="{Binding DragDropCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="PreviewDragOver">
<cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
<i:EventTrigger EventName="PreviewDragEnter">
<cmd:EventToCommand Command="{Binding PreviewDragEnterCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
ViewModel
DragDropCommand = new Commands.RelayCommand(parameter =>
{
var arg = parameter as System.Windows.DragEventArgs;
//DoDrag //(?)
string text = arg.Data.GetData(System.Windows.DataFormats.Text).ToString();
TreeCollection.Add(new TreeItem() { Text = text }); //Эта коллекция привязана к TreeView
}, parameter => true);
PreviewDragEnterCommand = new Commands.RelayCommand(parameter =>
{
//drgevent.Handled = true; //(?)
var drgevent = parameter as System.Windows.DragEventArgs;
if (drgevent.Data.GetDataPresent(System.Windows.DataFormats.Text))
{
drgevent.Effects = System.Windows.DragDropEffects.Move;
}
else
drgevent.Effects = System.Windows.DragDropEffects.None;
}, parameter => true);
Вопросы:
Буду благодарен за примеры.
Существует готовое решение, совместимое с MVVM. Рекомендую использовать и не изобретать собственный велосипед. Если очень хочется, подсмотри реализацию и перепиши под себя.
Если же это решение не подходит, то, обычно, используются класс-контроллер, который обрабатывает независимые события и запоминает текущее состояние: перетаскивается данная ViewModel, курсор находится над этой ViewModel и т.д., в результате чего, на момент срабатывания Drop, у тебя есть информация обо всех участниках процесса. Контроллер спускается во все зависимые компоненты, включая команды перетаскивания элементов.
Как говорится:
MVVM is dead, long live MVVMC!
Продвижение своими сайтами как стратегия роста и независимости