#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. К сожалению, это не так.