У меня есть DataGrid со столбцами разных типов, которые я добавляю в код. Я подклассифицировал стандартную сетку данных, чтобы я мог переопределить метод OnExecutedPaste и т.д. Однако это только срабатывает, если пользователь вставляет, пока ячейка не находится в режиме редактирования; если ячейка находится в режиме редактирования, содержимое буфера обмена просто вставляется в ячейку. Я хочу захватить событие вставки так, чтобы, если буфер обмена содержит несколько значений (например, данные из Excel), я могу поместить каждое значение в другую ячейку.
Могу ли я перехватить событие вставки, прежде чем ячейка обработает его? Надеюсь, без подклассификации всех столбцов и реализации моего собственного поколения ячеек и т.д.!
Вероятно, вам не нужно подклассифицировать 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();
}
}
}
}
}