J'essaye de supprimer un objet de type Order d'une listview qui est envoyé à partir d'une autre listview dans le même contrôle listview. Le xaml pour ces vues de liste est comme ceci:

 <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>

J'essaie donc de glisser-déposer des commandes entre deux vues de liste. Le problème est que lorsque je l'ai déposé, je dois supprimer l'ordre de glisser-déposer de la vue de liste d'où je l'ai fait glisser.

J'utilise ce code 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);
        }

Il est également possible de faire glisser d'une listbox vers l'une des listviews (non inclus dans le code)

C'est pourquoi

 orderlist.Remove(order);

Est là-dedans

0
Kevin Tinnemans 16 janv. 2017 à 22:23

2 réponses

Meilleure réponse

La propriété ItemsSource de ListView à partir de laquelle vous faites glisser l'objet depuis doit également être définie ou liée à un ObservableCollection<Order>. Ensuite, vous devriez simplement pouvoir supprimer l'élément déposé de cette collection une fois que vous y avez fait référence:

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);
}
1
mm8 17 janv. 2017 à 14:08

Au lieu de transmettre le DataContext du TextBlock en tant que données à l'action DragAndDrop, passez le TextBlock lui-même.

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

Ensuite, dans le gestionnaire de dépôt, vous pouvez maintenant accéder à ItemsControl (via des méthodes d'assistance statiques) qui contient le TextBlock, et en utilisant ItemsControl, vous pouvez obtenir la collection ItemsSource sous-jacente.

    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);
    }

Cela supprimera l'ordre glissé du ItemsControl dans lequel il était à l'origine contenu.

-1
Patrick B. 17 janv. 2017 à 03:14