从数据网格单元格复制文本

本文关键字:复制 文本 单元格 网格 数据 数据网 | 更新日期: 2023-09-27 18:02:52

我希望能够从DataGrid Cell复制文本。

  1. 第一个可能的解决方案是将SelectionUnit设置为Cell,但这不是我的选择,因为我需要选择FullRow
  2. 第二种可能的方法是DataGridTemplateColumn中有只读TextBox。但风格有个问题。我之前的问题:DatagridCell样式被文本框样式覆盖。我需要一行文字的颜色非常亮,但是选定行的颜色非常暗。
  3. 第三是在DataGrid上设置IsReadOnly="False",并为DataGridTextColumn提供EditingElementStyle

    <Style x:Key="EditingStyle" TargetType="{x:Type TextBox}">
    <Setter Property="IsReadOnly" Value="True"/>
    </Style>
    ...  
    <DataGridTextColumn ... EditingElementStyle="{DynamicResource EditingStyle}"/>
    

    但是这里有一个非常可怕的错误WPF Datagrid Text Column允许一个字符的文本输入当内部文本框被设置为只读

你知道有什么不同的解决方法吗?或解决方案?谢谢你。

编辑

我注意到DataGrid扩展WPF工具包没有这个错误,但它似乎有不同的结构,我将无法应用我的数据网格样式。

我注意到使用ReadOnly TextBox作为EditingElementStyle的DataGridColumn带来了进一步的问题。当您使用单向绑定时,则不可能使单元格进入编辑状态。让用户重写例如ID在DataGrid中显示的某些实体是不可接受的。所以它必须是只读的或者至少是单向的绑定

目前我根本没有解决这个问题的办法。是否有其他方法可以让用户从单元格中复制,而行被选中并突出显示?难道我没有注意到其他解决方案吗?谢谢你的阅读。

从数据网格单元格复制文本

您可以做一些肮脏的事情来获得当前单元格。在xaml中添加

<DataGrid GotFocus="DataGrid_GotFocus" KeyDown="DataGrid_KeyDown">

和代码后面的

private void DataGrid_GotFocus(object sender, RoutedEventArgs e)
{
    if(e.OriginalSource is DataGridCell)
        _currentCell = (DataGridCell) e.OriginalSource;
}
private void DataGrid_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Key == Key.C && (e.SystemKey == Key.LeftCtrl || e.SystemKey == Key.RightCtrl))
    {
         //Transform content here, like
         Clipboard.SetText(_currentCell.Content);
    }
}

应该这样做,因为每次在数据网格中更改选择时都会执行GotFocus