Я пытаюсь реализовать перетаскивание в проекте по разработке программного обеспечения в университете.
Вот данные, которые я пытаюсь отобразить
- Сообщение - класс, содержащий идентификатор и список целых чисел.
- Макрос - Класс, содержащий список сообщений.
В одном списке я хочу отображать сообщения и макросы. Достаточно просто, используя шаблоны данных с селектором шаблонов данных. Мои проблемы приходят с перетаскиванием.
Вот поведение, которого я хочу достичь
- Перетаскивание сообщения в основной список добавит его в основной список.
- Перетаскивание сообщения из основного списка в макрос переместит этот элемент из основного списка в список макросов
- Перетаскивание сообщения из списка макросов в основной список переместит этот элемент из список макросов в основной список.
- Перетаскивание сообщения в макрос добавит сообщение в список макросов.
Я использую шаблоны данных для макроса и сообщения, поэтому существует один класс модели представления. Таким образом, существует единственная реализация метода интерфейса, необходимого для интерфейса IDropTarget. Моя проблема в том, что обработчик удаления, определенный в шаблоне данных списка макросов, не использует метод интерфейса, определенный обработчиком событий. Это также не работает, когда я пытаюсь определить новый обработчик событий.
Большая часть класса модели View. (дайте мне знать, если вы хотите, чтобы остальные. Не кажется релевантным Imo )
public class MacroTreeViewModel:INotifyPropertyChanged, IDropTarget
{
private MacroTreeView view;
private MacroTreeModel model;
IMessage SelectedMessage { get; set; }
public List<IMessage> Macros { get { return MacroManager.Instance.Macro.Messages; } }
public MacroTreeViewModel(MacroTreeView view)
{
this.view = view;
model = new MacroTreeModel();
MacroManager.Instance.OnMessageListChange += (CANMacro macro) =>
{
model.HeadMacro = macro;
};
}
void IDropTarget.DragOver(IDropInfo dropInfo)
{
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Move;
}
void IDropTarget.Drop(IDropInfo dropInfo)
{
}
void OtherDrop(IDropInfo di) {
}
void OtherDrag(IDropInfo dropInfo)
{
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Move;
}
}
Вот мой основной список просмотра XAML
<ListView x:Name="MacroList"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DropHandler="{Binding}"
ItemsSource="{Binding Macros}"
SelectedItem="{Binding SelectedMessage, Mode=TwoWay}"
BorderBrush="Black" Height="320" Grid.Column="1"
ItemTemplateSelector="{StaticResource myDataTemplateSelector}">
</ListView>
Вот мой шаблон данных для макроса . Обратите внимание: "dd: DragDrop.DropHandler =" {Binding} "". Я надеялся, что это будет относиться к реализации интерфейса метода. Кажется, это не так. Другая попытка, которую я сделал, была "dd: DragDrop.DropHandler =" {Binding OtherDrop} "" и "dd: DragDrop.DropHandler =" OtherDrop "" безрезультатно. (точки отладки использовались для определения этого, объясняя, почему методы пусты)
<DataTemplate x:Key="MacroTemplate" DataType="Macro" ItemsSource="{Binding Messages}" >
<Grid>
<Border BorderBrush="Black" BorderThickness="6" CornerRadius="16">
<Label Content="{Binding Name}" Margin="14,17,306,0" Height="31" VerticalAlignment="Top"/>
</Border>
<Border BorderBrush="Black" BorderThickness="6" CornerRadius="16" Margin="16,57,18,16">
<ListBox Margin="0,0,1,1"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.DragHandler="{Binding}"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.DropHandler="{Binding}" ItemsSource="{Binding Messages}" Background="Transparent" BorderThickness="0"/>
</Border>
</Grid>
</DataTemplate>
Вот мой шаблон сообщения
<DataTemplate x:Key="MessageTemplate" DataType="Message" >
<Border BorderBrush="Black" BorderThickness="3" HorizontalAlignment="Stretch">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Label Content="{Binding Id}" Grid.Column="0"></Label>
<Label Content="{Binding DataString}" Grid.Column="1"></Label>
</Grid>
</Border>
</DataTemplate>
Так как я могу определить два отдельных обработчика событий для перетаскивания в одной модели представления, где к одному из этих обработчиков событий обращается шаблон данных с помощью GONG wpf (https://github.com/punker76/gong-wpf-dragdrop). Есть ли лучший способ, которым я могу справиться с этим? Заранее спасибо.