我使用gong-wpf库通过数据绑定列表框中的拖放重新排序项目:
<ListBox ItemsSource="{Binding Collection}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True" />
是否有一个简单的解决方案,拖动的项目在放到新位置时会保持其IsSelected值?不幸的是,每次拖放操作都会清除listBox SelectedItem。
我已经考虑过实现IDropTarget接口,然后在drop handler中执行此操作。但在这种情况下,我必须完全自己实现重新排序逻辑。真的没有更简单的解决方案吗?
答案 0 :(得分:1)
尝试添加PreviewMouseLeftButtonDown
事件。
像这样,
public DragDropWindow()
{
Style itemContainerStyle = new Style(typeof(ListBoxItem));
itemContainerStyle.Setters.Add(new Setter(ListBoxItem.AllowDropProperty, true));
itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(s_PreviewMouseLeftButtonDown)));
itemContainerStyle.Setters.Add(new EventSetter(ListBoxItem.PreviewMouseMoveEvent, new MouseEventHandler(s_PreviewMouseMoveEvent)));
listbox1.ItemContainerStyle = itemContainerStyle;
}
拖放过程
void s_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (sender is ListBoxItem)
{
ListBoxItem draggedItem = sender as ListBoxItem;
DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
draggedItem.IsSelected = true;
}
}
或者
添加PreviewMouseMoveEvent
像这样,
void s_PreviewMouseMoveEvent(object sender, MouseEventArgs e)
{
if (sender is ListBoxItem && e.LeftButton == MouseButtonState.Pressed)
{
ListBoxItem draggedItem = sender as ListBoxItem;
DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);
draggedItem.IsSelected = true;
}
}
以上代码是一个基本主题,您可以根据自己的要求进行更改。无论是在控制范围内还是在控制范围内。
有关详情,请参阅here