ListBox使用gong-wpf拖放 - 保持选择活着

时间:2016-02-21 18:10:18

标签: c# wpf drag-and-drop listbox

我使用gong-wpf库通过数据绑定列表框中的拖放重新排序项目:

<ListBox ItemsSource="{Binding Collection}"
 dd:DragDrop.IsDragSource="True"
 dd:DragDrop.IsDropTarget="True" />

是否有一个简单的解决方案,拖动的项目在放到新位置时会保持其IsSelected值?不幸的是,每次拖放操作都会清除listBox SelectedItem。

我已经考虑过实现IDropTarget接口,然后在drop handler中执行此操作。但在这种情况下,我必须完全自己实现重新排序逻辑。真的没有更简单的解决方案吗?

1 个答案:

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