Drag & drop entre deux listbox utilisant un binding sur entity
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:
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:
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:
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