2011-04-29 57 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推薦

複製整個小區