7

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

  1. 第一个可能的解决方案可能是设置SelectionUnit为,Cell但这不是我的选择,因为我需要选择FullRow
  2. 第二种可能的方法是DataGridTemplateColumn使用 readonly TextBox。但是样式有问题。我之前的问题:DatagridCell 样式被 TextBox 样式覆盖。我需要为行中的文本提供非常明亮的颜色,但在所选行中非常暗。
  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 允许输入一个字符文本,这是一个非常可怕的错误。

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

编辑

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

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

目前我对此根本没有解决方案。有没有其他方法可以让用户在选择并突出显示行时从单元格中复制?我没有注意到其他解决方案吗?谢谢阅读。

4

1 回答 1

2

你可以做一些肮脏的事情来获取当前的单元格。在您的 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每次在数据网格本身中更改选择时都会执行。

于 2013-03-23T15:20:05.447 回答