您可以检查DataObject.AddPastingHandler,它允许您为粘贴事件定义一个处理程序,如为 TextBox 显示的here。
问题是粘贴事件只有在控件已经接受它时才会发生:
对于 DataGrid,只有当您尝试粘贴不是您想要实现的可编辑单元格时才会发生这种情况。
我认为您应该创建一个继承自直接接受粘贴的控件的 CustomControl(例如 TextBox),但您必须重新创建 DataGrid 的一些依赖项(例如 itemsSource)。
我设置了一个小演示,以便您检查不同的行为:
MainWindow.xaml:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<!--Simple DataGrid-->
<DataGrid x:Name="DataGrid" AutoGenerateColumns="False" MaxWidth="150" Grid.Column="0">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Col1" Binding="{Binding Path=BusinessItem1}">
</DataGridTextColumn>
<DataGridTextColumn x:Name="Col2" Binding="{Binding Path=BusinessItem2}"/>
</DataGrid.Columns>
</DataGrid>
<!--TextBox (so that we can use the copy paste functionnality) modified to show a dataGrid-->
<TextBox x:Name="TextBoxButActuallyReallyADataGrid" Grid.Column="1">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<DataGrid MinHeight="250" Margin="10" Background="LightBlue" MinWidth="250" x:Name="DataGridForDemoCustomControl" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="CustomCol1" Binding="{Binding Path=BusinessItem1}"/>
<DataGridTextColumn x:Name="CusomCol2" Binding="{Binding Path=BusinessItem2}"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TextBox.Style>
</TextBox>
<!--To show the default behavior on a real textBox-->
<TextBox x:Name="TestTexBox" Text="Default_Text" Grid.Column="2"/>
</Grid>
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//Since it is a demo, I didn't create a ViewModel nor the Bindings but I recommand doing it
this.GetData();
this.DataGrid.ItemsSource = this.MyData;
//Add an handler to the pasting event for the specified dataObject
//https://docs.microsoft.com/en-gb/dotnet/api/system.windows.dataobject.addpastinghandler?view=netcore-3.1
DataObject.AddPastingHandler(this.DataGrid, PasteHandler);
DataObject.AddPastingHandler(TextBoxButActuallyReallyADataGrid, PasteHandlerForTemplatedTextBox);
DataObject.AddPastingHandler(TestTexBox, PasteHandlerForTextBox);
}
private void PasteHandlerForTextBox(object sender, DataObjectPastingEventArgs e)
{
if (sender is TextBox textbox && e.DataObject.GetDataPresent(typeof(string)))
{
}
else
{
e.CancelCommand();
}
}
private void PasteHandlerForTemplatedTextBox(object sender, DataObjectPastingEventArgs e)
{
if (sender is TextBox dataGrid && e.DataObject.GetDataPresent(typeof(string)))
{
}
else
{
e.CancelCommand();
}
}
private void PasteHandler(object sender, DataObjectPastingEventArgs e)
{
if (sender is DataGrid dataGrid && e.DataObject.GetDataPresent(typeof(string)))
{
}
else
{
e.CancelCommand();
}
}
private void GetData()
{
for (int i = 0; i < 18; i++)
{
MyData.Add(new MyRowElement { BusinessItem1 = "text1_" + i.ToString(), BusinessItem2 = "text2_" + i.ToString() });
}
}
public ObservableCollection<MyRowElement> MyData { get; private set; } = new ObservableCollection<MyRowElement>();
}
public class MyRowElement
{
public string BusinessItem1 { get; set; }
public string BusinessItem2 { get; set; }
}
如果您不想创建 CustomControl,您可以像我的示例中那样创建,但您将无法在 codeBehind 中按名称访问 dataGrid。