3

我有一个 C# WPF Datagrid,带有复选框列、超链接列和文本列。我的 DataGrid 绑定到一个 DataTable。这些列不是自动生成的,但我确实在代码中动态创建它们,因为事先不知道列的数量。我想启用要选择的单元格中的文本(用于 ctrl+c 目的)但禁用编辑。我不想更改文本。任何人都可以帮忙吗?

4

3 回答 3

7

一种可能是使用 DataGridTemplateColumn:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox IsReadOnly="True" Text="{Binding YourProperty,Mode=OneWay}"/>                            
        </DataTemplate>                        
    </DataGridTemplateColumn.CellTemplate>                    
</DataGridTemplateColumn>

这也适用于复选框,添加一个 CheckBox,绑定其 IsChecked 并将设置为 IsReadOnly 的 TextBox 用作内容。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="{Binding YourBooleanValue}">
                <TextBox IsReadOnly="True" Text="YourCopyableTextOrABindingToText"/>
            </CheckBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

如果您想让复选框只读,请将其 Enabled-property 设置为 false。但是,在这种情况下,您必须将 TextBox 声明为不是子项,而是声明为 CheckBox 的兄弟(使用网格或 StackPanel)。

如果要使整个 DataGrid 的数据只读,请使用:

<DataGrid IsReadOnly="True">

这也适用于列:

<DataGridTextColumn IsReadOnly="True">

如果要每行定义它,则必须使用DataGridTemplateColumns 并绑定编辑控件的 IsReadOnly-proeprty。

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox IsReadOnly="{Binind YourReadOnlyProperty}" Text="{Binding YourProperty,Mode=OneWay}"/>
        </DataTemplate>                        
    </DataGridTemplateColumn.CellTemplate>                    
</DataGridTemplateColumn>
于 2011-04-29T10:12:30.583 回答
2

如果您的用户通常一次复制整个单元格,您可以将 DataGrid 设置SelectionUnit为 Cell

如果他们复制单元格的部分,您最好覆盖 CellTemplate 以显示 HCL 推荐的标签

于 2011-04-29T12:42:39.573 回答
-2

我相当肯定,如果您将 DataGridTextBoxColumn 的 IsReadOnly 属性设置为 true,您仍然可以选择和复制内容。

于 2011-04-29T10:14:17.083 回答