0

在我的主视图Listbox中,我设置了一个(除其他外)PreviewMouseLeftButtonDownEvent用于支持拖放重新排序的。

var style = ListBox.ItemContainerStyle;

style.Setters.Add(new Setter(AllowDropProperty, true));

style.Setters.Add(new EventSetter(PreviewMouseLeftButtonDownEvent, 
  new MouseButtonEventHandler(Input_Down)));

private void Input_Down(object sender, EventArgs e)
{
    if (!(sender is ListBoxItem))
       return;

    var draggedItem = sender as ListBoxItem;

    isDragging = true;
    StartDrag(draggedItem);
}

private void StartDrag(ListBoxItem draggedItem)
{
    draggedItem.IsSelected = true;
    DragDrop.DoDragDrop(draggedItem, draggedItem.DataContext, DragDropEffects.Move);

}

在其中ListBox.ItemTemplate有一个带有更新命令的按钮:

    <Button Command="{Binding Path=UpdateCommand}" Content="Button"/>

但是,当我设置PreviewMouseLeftButtonDownEvent. 如果我删除PreviewMouseLeftButtonDownEvent设置器,该命令可以正常工作。关于为什么会这样以及如何使用两者的任何想法?

4

1 回答 1

0

DragDrop.doDragDrop()操作似乎阻止了所有底层事件,这意味着来自被单击按钮的命令不会被触发。

由于我没有找到任何干净的方法,因此我决定进行hack。在 ListBox.ItemContainerStyle 的事件处理程序中,我检查 RoutedEventArgs 中的原始源是否是附有 ICommand 的 Button。如果是这样,我中止 DragDrop.doDragDrop() 过程:

style.Setters.Add(new EventSetter(PreviewMouseLeftButtonDownEvent, 
  new MouseButtonEventHandler(Input_Down)));

private void Input_Down(object sender, RoutedEventArgs e)
{
    if (EventTriggeredByButtonWithCommand(e))
        return;

    var draggedItem = sender as FrameworkElement;

    if(draggedItem !=null)
        StartDrag(draggedItem);

}
bool EventTriggeredByButtonWithCommand(RoutedEventArgs e)
{
    var frameWorkElement = e.OriginalSource as FrameworkElement;

    if (frameWorkElement == null) 
        return false;

    var button = frameWorkElement.TemplatedParent as Button;

    if (button == null) 
        return false;

    return button.Command != null;
}
于 2013-07-22T14:57:00.127 回答