Bonjour

je suis actuellement sur un projet où je souhaiterai réaliser un drag and drop entre deux listbox plutôt que de créer deux boutons "add" et "remove".

Le souci se pose au niveau du contenu des listboxs. Ces listboxs sont peuplées par des observableCollection provenant d'un entityframework.

Or quand j'essaye des codes trouvés sur le net il me met l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
Opération non valide quand ItemsSource est en cours d'utilisation. Accédez aux éléments et modifiez-les avec ItemsControl.ItemsSource.
J'ai également une méthode qui me permet de récupérer la donnée mais celle ci m'indique :
L'instance ObjectContext a été supprimée et ne peut plus être utilisée

Cela fait un petit moment que je cherche maintenant mais... je bloque. Il y a beaucoup d'exemple sur le drag and drop entre deux listes, mais liées à un entity... cela semble plus rare.
Xaml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
 <ListBox IsSynchronizedWithCurrentItem="True" DataContext="{Binding User,Source={StaticResource Locator}}" Name="ListDesPermissions" Grid.Row="1" Grid.Column="1" DisplayMemberPath="nom" ItemsSource="{Binding UsersRoleDispo}" PreviewMouseLeftButtonDown="ListDesPermissions_PreviewMouseLeftButtonDown"  />
 <ListBox  AllowDrop="True" Name="ListDesPermissionsDispo" Grid.Row="1" Grid.Column="4" DisplayMemberPath="nom" ItemsSource="{Binding Roles}" Drop="ListDesPermissionsDispo_Drop"  />
C#
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 
ListBox dragSource = null;
        private void ListDesPermissions_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            ListBox parent = (ListBox)sender;
            dragSource = parent;
 
            object data = GetDataFromListBox(dragSource, e.GetPosition(parent));
            MessageBox.Show(data.ToString());
            if (data != null)
            {
                DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
            }
        }
        private static object GetDataFromListBox(ListBox source, Point point)
        {
            UIElement element = source.InputHitTest(point) as UIElement;
            if (element != null)
            {
                object data = DependencyProperty.UnsetValue;
                while (data == DependencyProperty.UnsetValue)
                {
                    data = source.ItemContainerGenerator.ItemFromContainer(element);
                    if (data == DependencyProperty.UnsetValue)
                    {
                        element = VisualTreeHelper.GetParent(element) as UIElement;
                    }
                    if (element == source)
                    {
                        return null;
                    }
                }
                if (data != DependencyProperty.UnsetValue)
                {
                    return data;
                }
            }
            return null;
        }
 
        private void ListDesPermissionsDispo_Drop(object sender, DragEventArgs e)
        {
            ListBox parent = (ListBox)sender;
            object data = e.Data.GetData(typeof(string));
            ((IList)dragSource.ItemsSource).Remove(data);
            parent.Items.Add(data);
        }
Merci de votre aide
Manu