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 :
J'ai également une méthode qui me permet de récupérer la donnée mais celle ci m'indique :
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.
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
C#
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" />
Merci de votre aide
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); }
Manu
Partager