WPF datagrid — включить выделение, отключить ввод текста

#wpf #datagrid #edit #datagridcell

#wpf #сетка данных #Редактировать #ячейка сетки данных

Вопрос:

У меня есть сетка данных C # WPF со столбцом флажков, столбцами гиперссылок и текстовыми столбцами. Моя DataGrid привязана к DataTable. Столбцы не генерируются автоматически, но я создаю их в коде динамически, поскольку количество столбцов заранее неизвестно. Я хотел бы включить выделение текста в ячейках (для целей ctrl c), но все же отключить редактирование. Я не хочу, чтобы текст изменялся. Кто-нибудь может помочь?

Ответ №1:

Вероятно, одной из возможностей является использование DataGridTemplateColumn:

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

Это работает также с флажками, добавьте флажок, привяжите его к IsChecked и используйте в качестве содержимого текстовое поле, для которого установлено значение IsReadOnly.

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

Если вы хотите, чтобы флажок был доступен только для чтения, установите для его свойства Enabled значение false. Однако в этом случае вы должны объявить текстовое поле не как дочернее, а как родственное по отношению к флажку (используйте для этого сетку или 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>
  

Комментарии:

1. Моя DataGrid привязана к DataTable, я создаю DataTable и столбцы в коде, поскольку количество столбцов известно только во время выполнения. Есть ли способ определить новые datagridtemplatecolumns таким образом, но динамически?

2. @Yoni: Одна из возможностей заключается в использовании XamlReader для создания ваших DataGridTemplateColumns «на лету» (путем конкатенации строк) и добавления их затем в коллекцию columns. Это выглядит не очень красиво, но я помню, что я делал это также в аналогичной ситуации, и это сработало нормально: msdn.microsoft.com/en-us/library/cc663033.aspx

Ответ №2:

Если ваши пользователи обычно копируют всю ячейку сразу, вы можете установить для сетки данных SelectionUnit значение Cell

Если они копируют разделы ячейки, вам лучше перезаписать CellTemplate для отображения метки в соответствии с рекомендациями HCL

Ответ №3:

Я почти уверен, что если вы установите для свойства IsReadOnly DataGridTextBoxColumn значение true, вы все равно сможете выбирать и копировать содержимое.

Комментарии:

1. К сожалению, это не так.