C# 如何从拖动项目的控件中删除已拖放的项目
我试图从同一listview控件中的另一个listview发送的listview中删除Order类型的对象。这些列表视图的xaml如下所示: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 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);
}