从DataGrid单元格复制文本

时间:2013-03-08 14:14:15

标签: c# wpf mvvm datagrid

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

  1. 第一种可能的解决方案是将SelectionUnit设置为Cell,但这不是我的选择,因为我需要选择FullRow
  2. 第二种可能的方法是让DataGridTemplateColumn包含只读TextBox。但是样式存在问题。我之前的问题:DatagridCell style overriden by TextBox style。我需要非常明亮的颜色用于行中的文本,但在所选行中确实很暗。
  3. 第三是在DataGrid上设置IsReadOnly =“False”并为EditingElementStyle提供DataGridTextColumn

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

    但是这里出现了一个非常可怕的错误WPF Datagrid Text Column allows one character text enter when the internal text box is set to read only.

  4. 你知道一些不同的解决方案吗?或解决方法?谢谢。

    修改

    我注意到来自Extended WPF ToolkitDataGrid没有此错误,但似乎它有不同的结构,我无法应用我的DataGrid样式。

    我注意到使用ReadOnly TextBox作为DataGridColumn的EditingElementStyle会带来更多问题。当您使用 OneWay 绑定时,无法将单元格设置为编辑状态。让用户覆盖DataGrid中显示的某个实体的 ID 是不可接受的。所以它必须以某种方式只读或至少 OneWay 绑定。

    此刻我完全无法解决这个问题。在选择并突出显示行时,是否有其他方法让用户从单元格复制?我没有注意到其他一些解决方案吗?谢谢阅读。

1 个答案:

答案 0 :(得分:1)

你可以做一些脏事来获得当前的细胞。在您的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就会被执行。