2017-01-16 68 views
0

我試圖從同一個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> 

所以我試圖拖放兩個listviews之間的訂單。 問題是,當我放棄它時,我必須從列表視圖中刪除拖動並從中拖出的順序。

我正在使用此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); 

在有

回答

1

您還應將對象拖動到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); 
} 
+0

你是最好的,謝謝你的小解釋,讓我覺得我學到了東西:) –

-1

強似的TextBlock的DataContext作爲DragAndDrop操作的數據傳入TextBlock本身。

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

然後在下拉菜單中的處理程序,你現在可以訪問ItemsControl的(通過靜態輔助方法),其中包含的TextBlock,並使用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中的拖動訂單。

+0

嗨帕特里克,感謝您的回答。問題是,當我從列表框中拖動一個訂單,因爲訂單爲空時,它崩潰 –

+0

Kevin,你能夠發佈ListBox的XAML和C#代碼來處理從ListBox啓動拖動操作的處理程序嗎? –

相關問題