Могу ли я перехватить вставку в ячейку DataGrid?

1

У меня есть DataGrid со столбцами разных типов, которые я добавляю в код. Я подклассифицировал стандартную сетку данных, чтобы я мог переопределить метод OnExecutedPaste и т.д. Однако это только срабатывает, если пользователь вставляет, пока ячейка не находится в режиме редактирования; если ячейка находится в режиме редактирования, содержимое буфера обмена просто вставляется в ячейку. Я хочу захватить событие вставки так, чтобы, если буфер обмена содержит несколько значений (например, данные из Excel), я могу поместить каждое значение в другую ячейку.

Могу ли я перехватить событие вставки, прежде чем ячейка обработает его? Надеюсь, без подклассификации всех столбцов и реализации моего собственного поколения ячеек и т.д.!

Теги:
wpf
wpfdatagrid

1 ответ

2
Лучший ответ

Вероятно, вам не нужно подклассифицировать Grid. Это больше похоже на WinForms. Я не знаю, какие типы столбцов вам нужны, но, возможно, это может указывать вам в правильном направлении:

DataObject.AddPastingHandler(yourControl, PastingHandler);

Вы можете создавать собственные типы столбцов, полученные из DataGridBoundColumn. Это довольно просто, а затем присоедините обработчик вставки к редактору editcontrol.

namespace StackOverflow
{
    public class CustomColumn : DataGridBoundColumn
    {
        protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        TextBlock block = new TextBlock();
        CustomColumn column = (CustomColumn)cell.Column;
        Binding binding = (Binding)column.Binding;
        if (binding != null)
        {
            // Binde den ausgewählten Wert
            Binding cellBinding = new Binding(binding.Path.Path);
            cellBinding.Source = dataItem;
            cellBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            cellBinding.ValidatesOnDataErrors = true;
            cellBinding.ValidatesOnExceptions = true;
            cellBinding.NotifyOnValidationError = true;
            cellBinding.ValidatesOnNotifyDataErrors = true;
            cellBinding.Mode = BindingMode.OneWay;

            block.SetBinding(TextBlock.TextProperty, cellBinding);

        }

        return block;
    }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        TextBox box = new TextBox();
        CustomColumn column = (CustomColumn)cell.Column;
        Binding binding = (Binding)column.Binding;
        if (binding != null)
        {
            // Binde den ausgewählten Wert
            Binding cellBinding = new Binding(binding.Path.Path);
            cellBinding.Source = dataItem;
            cellBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            cellBinding.ValidatesOnDataErrors = true;
            cellBinding.ValidatesOnExceptions = true;
            cellBinding.NotifyOnValidationError = true;
            cellBinding.ValidatesOnNotifyDataErrors = true;
            cellBinding.Mode = BindingMode.TwoWay;

            box.SetBinding(TextBlock.TextProperty, cellBinding);

        }

            DataObject.AddPastingHandler(box, PastingHandler);
            return box;
        }

        private void PastingHandler(object sender, DataObjectPastingEventArgs e)
        {
            TextBox textBox = sender as TextBox;
            if (textBox == null)
            {
                return;
            }

            if (e.DataObject.GetDataPresent(typeof(string)))
            {
                //Read input
                string pasteText = e.DataObject.GetData(typeof(string)) as string;
                // Kommt ein neuer String zurück, wird dieser eingefügt und die ursprüngliche Operation abgebrochen.
                if (!string.IsNullOrEmpty(pasteText))
                {
                    // Neuen Text einbringen
                    textBox.Text = pasteText;
                    // Restliches Einfügen abbrechen
                    e.CancelCommand();
                }
            }
        }
    }
}
  • 0
    Спасибо! Я попытался добавить обработчик вставки к самой сетке, и это, кажется, перехватывает вставку для ячеек текстового поля, но не для других ячеек, например, флажок или поле со списком. Тем не менее, именно эти другие работают с моим методом подкласса - поэтому, сочетая оба метода, я думаю, я смогу заставить все это работать! Еще раз спасибо!
  • 0
    Ну, тогда отлично! :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню