如何从拖动项目的控件中删除删除的项目

How to remove dropped item from control where item was dragged from

我正在尝试从同一列表视图控件中的另一个列表视图发送的列表视图中删除 Order 类型的对象。这些列表视图的 xaml 是这样的:

 <ListView x:Name="listView" HorizontalAlignment="Left" Height="448" ItemsSource="{Binding}" VerticalAlignment="Top" Width="664" Margin="121,43,-2,0">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" Height="100"></StackPanel>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Vertical">
                        <Button x:Name="Up" Content="^" Click="Up_Click"/>
                        <Button x:Name="Down" Content="v" Click="Down_Click"/>
                        <TextBlock Text="{Binding Chauffeur.Naam}" Width="50"/>
                        <ListView x:Name="Swagnek" ItemsSource="{Binding Orders}" Height="50" AllowDrop="True" DragEnter="ListView_DragEnter" PreviewDragOver="ListView_PreviewDragOver" Drop="ListView_Drop">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock x:Name="HoiDoei" HorizontalAlignment="Stretch" Text="{Binding ID}" MouseRightButtonDown="HoiDoei_MouseRightButtonDown" MouseLeftButtonDown="HoiDoei_MouseLeftButtonDown" />
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

所以我正在尝试在两个列表视图之间拖放订单。 问题是,当我放下它时,我必须从我拖动它的列表视图中删除拖放顺序。

我正在使用这个 c# 代码。

       private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {

                var tb = (TextBlock)sender;
                DragDrop.DoDragDrop(this, (Order)tb.DataContext, DragDropEffects.Copy);
            }

   private void ListView_DragEnter(object sender, DragEventArgs e)
        {
            e.Effects = DragDropEffects.Move;
        }

        private void ListView_PreviewDragOver(object sender, DragEventArgs e)
        {
            e.Handled = true;
        }

        private void ListView_Drop(object sender, DragEventArgs e)
        {
            var lv = sender as ListView;
            if (lv.ItemsSource == null)
                lv.ItemsSource = new ObservableCollection<Order>();
            var order = e.Data.GetData(typeof(Order)) as Order;
            var items = lv.ItemsSource as ObservableCollection<Order>;
            items.Add(order);
            orderlist.Remove(order);
        }

也可以从列表框拖动到其中一个列表视图(未包含在代码中)

这就是为什么

 orderlist.Remove(order);

在那里

不是将 TextBlock 的 DataContext 作为数据传递给 DragAndDrop 操作,而是传递 TextBlock 本身。

    private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        DragDrop.DoDragDrop(this, (TextBlock)sender, DragDropEffects.Copy);
    }

然后在放置处理程序中,您现在可以访问包含 TextBlock 的 ItemsControl(通过静态辅助方法),并使用 ItemsControl 获取基础 ItemsSource 集合。

    private void ListView_Drop(object sender, DragEventArgs e)
    {
        var lv = (ListView)sender;
        if (lv.ItemsSource == null)
        {
            lv.ItemsSource = new ObservableCollection<Order>();
        }

        var tb = (TextBlock)e.Data.GetData(typeof(TextBlock));
        var order = (Order)tb.DataContext;

        var container = ItemsControl.ContainerFromElement(null, tb);
        var control = ItemsControl.ItemsControlFromItemContainer(container);
        (control.ItemsSource as ICollection<Order>)?.Remove(order);

        (lv.ItemsSource as ObservableCollection<Order>)?.Add(order);

        orderlist.Remove(order);
    }

这将从最初包含它的 ItemsControl 中删除拖动的订单。

您从 拖动对象 的 ListView 的 ItemsSource 属性 也应该设置或绑定到 ObservableCollection<Order>。然后,一旦您引用了该集合,您就应该能够从该集合中删除掉落的项目:

ObservableCollection<Order> _source;
private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

    var tb = (TextBlock)sender;
    ListView parentListView = FindParent<ListView>(tb);
    if (parentListView != null)
        _source = parentListView.ItemsSource as ObservableCollection<Order>;
    DragDrop.DoDragDrop(this, (Order)tb.DataContext, DragDropEffects.Copy);
}

public static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

private void ListView_Drop(object sender, DragEventArgs e)
{
    var lv = sender as ListView;
    if (lv.ItemsSource == null)
        lv.ItemsSource = new ObservableCollection<Order>();
    var order = e.Data.GetData(typeof(Order)) as Order;
    var items = lv.ItemsSource as ObservableCollection<Order>;
    items.Add(order);
    orderlist.Remove(order);
    if (_source != null && _source.Contains(order))
        _source.Remove(order);
}