2010-06-01 38 views
11

Tengo una situación que necesita condicionalmente hacer readonly a wpf datagrid cell. Hay propiedad IsReadOnly en DataGridCell. ¡Pero desafortunadamente, esa propiedad es solo de lectura! ¿Hay alguna forma de hacerlo?
ant.Condicionalmente haciendo readonly a WPF DataGridCell

+0

IsReadOnly es un resultado booleano para comprobar si la celda es readOnly o Not, es por eso que es una propiedad de solo lectura :) – VoodooChild

+0

La propiedad IsReadOnly es de lectura/escritura en DataGrid que es el elemento raíz de datagrid. La propiedad IsReadOnly no se puede establecer en subelementos de DataGrid como DataGridCell porque no tiene sentido establecer DataGridCell.IsReadOnly en true cuando DataGrid.IsReadyOnly es falso – VoodooChild

+1

@VoodooChild La razón principal por la que no se puede establecer IsReadOnly en un DataGridCell es porque son transitorios. Se crean y descartan según sea necesario porque DataGrid no mantiene todas sus filas y celdas en la memoria en ningún momento. Por lo tanto, no hay lugar para que establezca esta propiedad, incluso si se puede escribir. – Josh

Respuesta

7

Debe poder utilizar el evento DataGrid.BeginningEdit para verificar condicionalmente si la celda es editable y luego establecer la propiedad Cancelar en los argumentos del evento si no es así.

0

También podría usar la propiedad TemplateSelector para establecer dos DataTemplates diferentes (una escribible y una de solo lectura) según su lógica? Simplemente cree una clase que herede de DataTemplateSelector y anule el método SelectTemplate() (aquí tiene acceso al contexto de datos).

7

La solución similar como Goblin anteriormente, pero con un poco ejemplos de código:

La idea es cambiar dinámicamente los CellEditingTemplate entre dos plantillas, una es el mismo que el de la CellTemplate, el otro es para la edición . Esto hace que el modo de edición actúe exactamente igual que la celda sin edición aunque esté en modo de edición.

El siguiente es un ejemplo de código para hacer esto, observe que este enfoque requiere DataGridTemplateColumn:

En primer lugar, definir dos plantillas para las células de sólo lectura y edición:

<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> 

a continuación, definir una plantilla de datos con capa adicional ContentPresenter y use Trigger para cambiar ContentTemplate del ContentPresenter, por lo que las dos plantillas anteriores se pueden cambiar dinámicamente por el enlace 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

+0

+1 para la única solución de WPF :) –

2

Otra solución muy sencilla a este problema es utilizar un estilo de la 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> 

Este estilo supone que hay una propiedad IsEnabled en el modelo de vista.

Esto no hace que la celda sea solo de lectura, sino que esté deshabilitada. Es casi lo mismo, excepto que no se puede seleccionar. Esta solución puede no ser aplicable en todos los casos debido a esto.

+1

Esto no funciona para celdas individuales, solo para columnas enteras. .. – Sven

+0

@Sven Me funciona ... – MgSam

+1

No funciona para celdas individuales. –

Cuestiones relacionadas