После DragDrop.DoDragDrop другие элементы управления в сетках не могут выбирать (не отвечает)

Я работаю над функцией перетаскивания с помощью xamdatagrid. Я реализовал функцию перетаскивания, как указано ниже.

1) Я создал событие PreviewMouseLeftButtonDown, и в этом случае я вызываю метод DragDrop.DoDragDrop(). 2) У меня есть еще одно событие MouseMove, в котором я получаю выбранную строку из сетки. Эту выбранную строку я использую в вышеупомянутом событии PreviewMouseLeftButtonDown для создания данных отбрасывания.

Моя проблема в том, что у меня есть выпадающий список (поле со списком) в той же сетке. Так как DragDrop.DoDragDrop() является методом синхронизации и вызывается из PreviewMouseLeftButtonDown, он не будет отпускать событие мыши до тех пор, пока перетаскивание в цель и выпадающий выбор не будут работать должным образом.

Я попытался установить булевы флаги, но я не могу отличить перетаскивание и выбор элемента управления (выпадающий выбор) от метода PreviewMouseLeftButtonDown. Мне нужно вызывать DragDrop.DoDragDrop() только всякий раз, когда я выполняю перетаскивание, не выбирая раскрывающийся список в строке сетки. Как определить, является ли операция перетаскиванием или выпадающим списком?

Есть ли другая альтернатива, чтобы включить события мыши, не ожидая результата DragDrop.DoDragDrop().

private void PreviewMouseLeftButtonDown (object sender, MouseButtonEventArgs e)
        {
            //record presenter I am setting PreviewMouseLeftButtonDown so I am doing the this
            var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
            if (grid != null)
                {
itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
var data = new DataObject();
                    data.SetData(DataFormats.StringFormat, itemName);
                    DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
                }
        }

// Это для получения выбранной строки

private void KeywordMouseMove(object sender, MouseEventArgs e)
 {
    var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
            if (grid != null)
            {
                //we have editable and not ediable columns.previously we faced issue with noe editable column drag so this added
                //Cell area will get for editable and presenter will get for non editable fields.This will get the selected row
                var drcellarea = e.Source as DataRecordCellArea;
                var drpresenter = e.Source as CellValuePresenter;

                DataRecord dataRecord = null;
                if (drcellarea != null)
                {
                    dataRecord = drcellarea.DataContext as DataRecord;
                }
                else if (drpresenter != null)
                {
                    dataRecord = drpresenter.DataContext as DataRecord;
                }

                if (dataRecord != null)
                {
                    var selectedItem = dataRecord.DataItem as VariableViewModel;
                    viewmodel.SelectedItem = selectedItem;
                }
            }

  }

1 ответ

Не видя никакого кода, довольно сложно точно понять, в чем проблема, но попробуйте вызвать DragDrop.DoDragDrop в MouseMove обработчик, чтобы увидеть, если это решит вашу проблему. Что-то вроде этого:

РЕДАКТИРОВАТЬ:

    private void KeywordMouseMove(object sender, MouseEventArgs e)
    {
        var grid = (sender as DataRecordCellArea).FieldLayout.DataPresenter as XamDataGrid;
        if (grid != null && e.LeftButton == MouseButtonState.Pressed)
        {
            itemName = variableViewModel.OriginalPrimaryKey, variableViewModel.Value, variableViewModel.Variable.GuiDisplayUnits;
            var data = new DataObject();
            data.SetData(DataFormats.StringFormat, itemName);

            DragDrop.DoDragDrop(grid, data, DragDropEffects.Copy);
        }
    }

Я изменил ваш KeyboardMouseMove обработчик, чтобы показать, что я имею в виду. Теперь он содержит код из вашего обработчика PreviewMouseLeftButtonDown, который вы теперь можете удалить. Я предполагаю, что у вас есть Drop обработчик на цель Element который получает объект данных из DragDrop операция и обрабатывает ее.

Другие вопросы по тегам