Условно делает чтение только для WPF DataGridCell - PullRequest
11 голосов
/ 01 июня 2010

У меня есть ситуация, которая требует условного чтения только для ячейки данных wpf. В DataGridCell есть свойство IsReadOnly. Но, к сожалению, это свойство только для чтения! Есть ли способ сделать это?
муравей.

Ответы [ 4 ]

7 голосов
/ 19 августа 2011

Подобное решение, как Goblin выше, но с небольшими примерами кода:

Идея состоит в том, чтобы динамически переключать 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>

НТН

7 голосов
/ 01 июня 2010

Вы должны иметь возможность использовать событие DataGrid.BeginningEdit , чтобы условно проверить, является ли ячейка редактируемой, а затем установить свойство Cancel для аргументов события, если нет.

2 голосов
/ 01 апреля 2014

Другим очень простым решением этой проблемы является использование стиля DataGridCell

<DataGrid>
    <DataGrid.Resources>
        <Style x:Key="disabledCellStyle" TargetType="DataGridCell">
            <Setter Property="IsEnabled" Value="{Binding IsEnabled}" />
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn CellStyle="{StaticResource disabledCellStyle}" />
        <DataGridCheckBoxColumn CellStyle="{StaticResource disabledCellStyle}" />
        <DataGridTextColumn/> /*always enabled*/
    </DataGrid.Columns>
</DataGrid>

Этот стиль предполагает, что в ViewModel есть свойство IsEnabled.

Это не делает ячейку доступной только для чтения, но отключенной. Это почти то же самое, за исключением того, что его нельзя выбрать. Это решение может быть применимо не во всех случаях из-за этого.

0 голосов
/ 01 июня 2010

Вы также можете использовать свойство TemplateSelector для установки двух разных шаблонов данных (один для записи и один для чтения) на основе вашей логики? Просто создайте класс, который наследуется от DataTemplateSelector, и переопределите метод SelectTemplate () (здесь у вас есть доступ к тексту данных).

...