WPF 数据网格 - 启用选择、禁用文本输入

发布于 2024-11-04 02:13:57 字数 154 浏览 4 评论 0原文

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

I have a C# WPF Datagrid, with a checkbox column, hyperlink columns and text columns.
My DataGrid is bound to a DataTable. The columns are not auto generated, but I do create them in code dynamically, since the number of columns is not known in advance.
I would like to enable the text in the cells to be selected (for ctrl+c purpose) but yet disable editing. I don't want the text to be changed.
Anyone can help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

脱离于你 2024-11-11 02:13:57

一种可能是使用 DataGridTemplateColumn:

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

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

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

如果您希望该复选框为只读,请将其 Enabled 属性设置为 false。但是,在这种情况下,您必须将 TextBox 声明为 CheckBox 的同级(使用网格或 StackPanel),而不是子级。

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

<DataGrid IsReadOnly="True">

这也适用于列:

<DataGridTextColumn IsReadOnly="True">

如果要按行定义它,则必须使用 DataGridTemplateColumn 并绑定 IsReadOnly 属性编辑控件。

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

One possibility is probably be to use a DataGridTemplateColumn:

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

This works also with Checkboxes, add a CheckBox, Bind its IsChecked and use as the content a TextBox that is set to IsReadOnly.

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

If you want to have the checkbox readonly, set its Enabled-property to false. However in this case, you have to declare the TextBox not as a child but as a sibling of the CheckBox (use a grid or a StackPanel) for this.

If you want to make data readonly for the whole DataGrid, use:

<DataGrid IsReadOnly="True">

THis is also possible for columns:

<DataGridTextColumn IsReadOnly="True">

If you want to define it per row, you have to use DataGridTemplateColumns and bind the IsReadOnly-proeprty of the edit-control.

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox IsReadOnly="{Binind YourReadOnlyProperty}" Text="{Binding YourProperty,Mode=OneWay}"/>
        </DataTemplate>                        
    </DataGridTemplateColumn.CellTemplate>                    
</DataGridTemplateColumn>
以往的大感动 2024-11-11 02:13:57

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

如果他们复制单元格的部分内容,您最好按照 HCL 的建议覆盖 CellTemplate 以显示标签

If your users usually copy an entire cell at once you can set the DataGrid's SelectionUnit to Cell

If they copy sections of a cell you're better off overwriting the CellTemplate to display a Label as HCL recommended

转身泪倾城 2024-11-11 02:13:57

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

I'm fairly sure that if you set the DataGridTextBoxColumn's IsReadOnly property to true, you'll still be able to select and copy the contents.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文