Я столкнулся с той же проблемой, ячейка должна быть доступна только для чтения в некоторых строках, но не в других.Вот обходное решение:
Идея состоит в том, чтобы динамически переключать CellEditingTemplate
между двумя шаблонами, один такой же, как в CellTemplate
, другой для редактирования.Это заставляет режим редактирования действовать точно так же, как и ячейка без редактирования, хотя он находится в режиме редактирования.
Ниже приведен пример кода для этого, обратите внимание, что для этого подхода требуется DataGridTemplateColumn
:
Сначала определите два шаблона для ячеек только для чтения и редактирования:
<DataGrid>
<DataGrid.Resources>
<!-- the non-editing cell -->
<DataTemplate x:Key="ReadonlyCellTemplate">
<TextBlock Text="{Binding MyCellValue}" />
</DataTemplate>
<!-- the editing cell -->
<DataTemplate x:Key="EditableCellTemplate">
<TextBox Text="{Binding MyCellValue}" />
</DataTemplate>
</DataGrid.Resources>
</DataGrid>
Затем определите шаблон данных с дополнительным слоем ContentPresenter
и используйте Trigger
для переключения ContentTemplate
ContentPresenter
, поэтому два вышеуказанных шаблона можно динамически переключать с помощью привязки IsEditable
:
<DataGridTemplateColumn CellTemplate="{StaticResource ReadonlyCellTemplate}">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<!-- the additional layer of content presenter -->
<ContentPresenter x:Name="Presenter" Content="{Binding}" ContentTemplate="{StaticResource ReadonlyCellTemplate}" />
<DataTemplate.Triggers>
<!-- dynamically switch the content template by IsEditable binding -->
<DataTrigger Binding="{Binding IsEditable}" Value="True">
<Setter TargetName="Presenter" Property="ContentTemplate" Value="{StaticResource EditableCellTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
HTH