Отдельное поведение перетаскивания в одной модели представления GONG Drag and Drop WPF - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь реализовать перетаскивание в проекте по разработке программного обеспечения в университете.

Вот данные, которые я пытаюсь отобразить

  • Сообщение - класс, содержащий идентификатор и список целых чисел.
  • Макрос - Класс, содержащий список сообщений.

В одном списке я хочу отображать сообщения и макросы. Достаточно просто, используя шаблоны данных с селектором шаблонов данных. Мои проблемы приходят с перетаскиванием.

Вот поведение, которого я хочу достичь

  • Перетаскивание сообщения в основной список добавит его в основной список.
  • Перетаскивание сообщения из основного списка в макрос переместит этот элемент из основного списка в список макросов
  • Перетаскивание сообщения из списка макросов в основной список переместит этот элемент из список макросов в основной список.
  • Перетаскивание сообщения в макрос добавит сообщение в список макросов.

Я использую шаблоны данных для макроса и сообщения, поэтому существует один класс модели представления. Таким образом, существует единственная реализация метода интерфейса, необходимого для интерфейса 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). Есть ли лучший способ, которым я могу справиться с этим? Заранее спасибо.

...