2011-04-29 58 views
3

我有一个C#WPF Datagrid,带有复选框列,超链接列和文本列。 我的DataGrid绑定到一个DataTable。这些列不是自动生成的,但是我会动态地在代码中创建它们,因为列的数量并不是事先知道的。 我想启用单元格中的文本来选择(为ctrl + c的目的),但禁用编辑。我不希望文字被改变。 任何人都可以提供帮助吗?WPF datagrid - 启用选择,禁用文本输入

回答

7

一种可能性是可能会使用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 IsReadOnly="True"> 

这也可能列:

<DataGridTextColumn IsReadOnly="True"> 

如果要定义每行吧,你有使用DataGridTemplateColumn s并绑定编辑控件的IsReadOnly-proeprty。

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

我的DataGrid绑定到一个DataTable,我创建了DataTable和代码中的列,因为只有在运行时才知道列数。有没有办法以这种方式定义新的datagridtemplatecolumns,但动态? – Yoni 2011-04-30 01:04:31

+0

@Yoni:一种可能性是使用XamlReader来动态构建DataGridTemplateColumns(通过字符串连接),然后将它们添加到列集合中。它看起来不是很好,但我记得我已经在类似的情况下也这样做了,它工作正常:http://msdn.microsoft.com/en-us/library/cc663033.aspx – HCL 2011-04-30 09:32:23

-1

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

+0

不幸的是,这是不正确的。 – Kugel 2011-08-10 16:59:50

2

如果您的用户通常一次可以设置DataGrid的SelectionUnit到细胞

如果他们复制细胞的部分,你最好覆盖CellTemplate显示标签为HCL推荐

复制整个小区