C# 如何从拖动项目的控件中删除已拖放的项目

C# 如何从拖动项目的控件中删除已拖放的项目,c#,wpf,listview,itemtemplate,C#,Wpf,Listview,Itemtemplate,我试图从同一listview控件中的另一个listview发送的listview中删除Order类型的对象。这些列表视图的xaml如下所示: <ListView x:Name="listView" HorizontalAlignment="Left" Height="448" ItemsSource="{Binding}" VerticalAlignment="Top" Width="664" Margin="121,43,-2,0"> <ListVi

我试图从同一listview控件中的另一个listview发送的listview中删除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>

在那里

而不是在中传递TextBlock的DataContext,因为到DragAndDrop操作的数据传递TextBlock本身

    private void ListView_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        DragDrop.DoDragDrop(this, (TextBlock)sender, DragDropEffects.Copy);
    }
然后在drop处理程序中,您现在可以访问包含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);
    }
private void ListView\u Drop(对象发送方,DragEventArgs e)
{
var lv=(列表视图)发送方;
if(lv.ItemsSource==null)
{
lv.ItemsSource=新的ObservableCollection();
}
var tb=(TextBlock)e.Data.GetData(typeof(TextBlock));
var order=(order)tb.DataContext;
var container=ItemsControl.ContainerFromElement(null,tb);
var control=ItemsControl.ItemsControlFromItemContainer(容器);
(control.ItemsSource as ICollection)?。删除(订单);
(lv.ItemsSource as ObservableCollection)?。添加(订单);
订单列表。删除(订单);
}

这将从它最初包含在其中的ItemsControl中删除拖动的顺序。

拖动对象的ListView的ItemsSource属性也应设置或绑定到
ObservableCollection
。那么,一旦您有了对该集合的引用,您就应该能够从该集合中删除删除的项目:

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);
}
observedcollection\u源;
私有无效列表视图_MouseLeftButtonDown(对象发送方,MouseButtonEventArgs e)
{
var tb=(TextBlock)发送方;
ListView parentListView=FindParent(tb);
if(parentListView!=null)
_source=parentListView.ItemsSource作为ObservableCollection;
DragDrop.DoDragDrop(此,(订单)tb.DataContext,DragDropEffects.Copy);
}
公共静态T FindParent(DependencyObject DependencyObject),其中T:DependencyObject
{
var parent=VisualTreeHelper.GetParent(dependencyObject);
if(parent==null)返回null;
var parentT=作为T的父项;
返回父母??找到父母(父母);
}
私有无效列表视图_Drop(对象发送方,DragEventArgs e)
{
var lv=作为列表视图的发送方;
if(lv.ItemsSource==null)
lv.ItemsSource=新的ObservableCollection();
var order=e.Data.GetData(typeof(order))作为订单;
var项目=lv.ItemsSource作为可观测集合;
项目。添加(订单);
订单列表。删除(订单);
if(_source!=null&&u source.Contains(order))
_来源.删除(命令);
}

嗨,帕特里克,谢谢你的回答。问题是,当我从列表框拖动订单时,它会崩溃,因为订单为空。Kevin,你能发布列表框的XAML和从列表框启动拖动操作的处理程序的C#代码吗?你是最好的,谢谢你的解释,让我觉得我学到了一些东西:)
    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);
    }
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);
}