2015-09-08 5 views
1

Я следовал this tutorial для реализации Drag & Drop on my datagrid. Я изменил его в соответствии с this link, чтобы иметь возможность перемещать элементы между группами.Событие MouseMove предотвращает «открытие» ComboBox

В моем документе есть столбец с кнопкой, поэтому я последовал за this answer, чтобы снова использовать кнопку. У меня также есть 3 столбца с ComboBoxes, и они не могут быть использованы (вы можете щелкнуть их, и тогда они выглядят как комбинированные поля, но второй щелчок не расширяет его).

Два из них определяются как DataGridComboBoxColumn и один определяется с DataGridTemplateColumn и ComboBox в теге DataGridTemplateColumn.CellEditingTemplate.

Первые два, как это:

<DataGridComboBoxColumn Header="Entity" 
    ItemsSource="{StaticResource tl}" 
    DisplayMemberPath="Name" 
    SelectedValuePath="Name" 
    SelectedValueBinding="{Binding Entity}" 
    x:Name="cmbEntity"></DataGridComboBoxColumn> 

Определение DataGrid выглядит следующим образом:

<DataGrid Grid.Row="1" Name="myGrid" IsManipulationEnabled="True" ItemsSource="{Binding Source={StaticResource cvs}}" AutoGenerateColumns="False" 
RowEditEnding="myGrid_RowEditEnding" PreviewKeyDown="myGrid_PreviewKeyDown" SelectedCellsChanged="myGrid_SelectedCellsChanged" 
AllowDrop="True" MouseMove="DataGrid_MouseMove" PreviewMouseLeftButtonDown="DataGrid_PreviewMouseLeftButtonDown" Drop="DataGridView_Drop"> 

И как уже упоминалось выше, методы реализованы в соответствии с учебных пособий. Я попытался использовать e.Handled=false в обработчиках событий, но это не помогло (и это, вероятно, бесполезно, так как открытие combobox - это не событие?)

Удалив один обработчик событий за один раз, я узнал, что событие MouseMove проблема, код выглядит следующим образом:

void DataGrid_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) { 

      Console.Out.WriteLine("MouseButtonState.Pressed"); 

      DataGrid dataGrid = sender as DataGrid; 
      prevRowIndex = GetDataGridItemCurrentRowIndex(dataGrid, e.GetPosition); 

      if (prevRowIndex < 0) { return;} 

      dataGrid.SelectedIndex = prevRowIndex; 
      DefaultValue selectedDV = dataGrid.Items[prevRowIndex] as DefaultValue; 

      if (selectedDV == null) { return; } 

      DragDropEffects dragDropEffects = DragDropEffects.Move; 
      if (DragDrop.DoDragDrop(dataGrid, selectedDV, dragDropEffects) != DragDropEffects.None) 
      { 
       dataGrid.SelectedItem = selectedDV; 
      }  
     } 
    } 

Я не совсем понимаю, почему это происходит, потому что я на самом деле не перемещаете мышь, я просто нажмите на ячейку, содержащую комбо коробка. Как-то возможно иметь оба, Drag & Drop и ComboBoxes?

EDIT: Я изменил проект от the tutorial Я использовал, чтобы показать проблему у меня есть: Download from my dropbox Я изменил столбец Зарплатный быть выпадающим (и, конечно, также добавил группирование, потому что я думаю, что это может быть важно)

+0

Было бы неплохо, если бы вы могли опубликовать минималистский проект, показывающий проблему, в противном случае потребуется много времени, чтобы пройти через все учебные пособия, которые вы сделали, чтобы воспроизвести вашу ошибку. – netaholic

+0

Хорошо, я сделаю это, но мне потребуется некоторое время (я не могу загрузить полный проект, потому что это мой собственный код). –

+0

Итак, как дела? – netaholic

ответ

0

Прежде всего, в чем была проблема.

Событие MouseMove было уволено даже при щелчке мышью без перемещения. Быстрый поиск подсказывает мне, что это интенсифицированное поведение. Тогда datagrid попытался бы поместить нажатую ячейку в режиме редактирования, но код события перемещения мыши вызовет DragDrop.DoDragDrop, чтобы не вызывать появление combobox.

Обходной, что я предлагаю было бы сделать следующее:

Определить в MainWindow:

 Point mousePositionOnButtonPress; 
     double deltaToStartDrag = 10; 

и изменить событие MouseMove к следующему:

if (e.LeftButton == MouseButtonState.Pressed) 
      { 
       var position = e.GetPosition(this); 
       if (mousePositionOnButtonPress == new Point()) 
       { 
        mousePositionOnButtonPress = new Point(position.X, position.Y); 
       } 
       else 
        if (Math.Abs(mousePositionOnButtonPress.X - position.X) > deltaToStartDrag || Math.Abs(mousePositionOnButtonPress.Y - position.Y) > deltaToStartDrag) 
        { 
         Console.Out.WriteLine("MouseButtonState.Pressed"); 

         DataGrid dataGrid = sender as DataGrid; 
         prevRowIndex = GetDataGridItemCurrentRowIndex(dataGrid, e.GetPosition); 

         if (prevRowIndex < 0) { return; } 

         dataGrid.SelectedIndex = prevRowIndex; 
         Employee selectedDV = dataGrid.Items[prevRowIndex] as Employee; 

         if (selectedDV == null) { return; } 

         DragDropEffects dragDropEffects = DragDropEffects.Move; 
         if (DragDrop.DoDragDrop(dataGrid, selectedDV, dragDropEffects) != DragDropEffects.None) 
         { 
          dataGrid.SelectedItem = selectedDV; 
         } 
        } 
       // 
      } 

также подписаться на DataGrid-е MouseUp следующим образом

private void dgEmployee_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      mousePositionOnButtonPress = new Point(); 
     } 

Это отложит начало перетаскивания до тех пор, пока пользователь не сдвинет его мышью до 10 пикселей.

Это то, что я должен сказать о вашей проблеме. Я также предлагаю вам ознакомиться с этой статьей. http://www.hardcodet.net/2009/03/moving-data-grid-rows-using-drag-and-drop ИМО имеет намного более чистый код, и он выглядит лучше. Я считаю, что с некоторой настройкой вы можете заставить его работать с группами.

+0

Действительно круто! Я думал, что это может быть что-то вроде этого (MouseMove уволен без движения), но это не имело смысла для меня ... –