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
Respuesta
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í.
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).
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
+1 para la única solución de WPF :) –
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. ¿Cómo hacer WPF DataGridCell ReadOnly?
- 2. Cómo extraer DataGridCell de la clase DataGridCellinfo en wpf
- 3. WPF ReadOnly Propiedades de dependencia usando MVVM
- 4. ¿Cómo puedo formatear condicionalmente un WPF TextBlock?
- 5. Enlace dinámico en la plantilla WGT DataGridCell
- 6. A readOnly Equivalent para HTML Select Elements
- 7. XAML ReadOnly de ComboBox
- 8. Haciendo un control móvil en WPF
- 9. @Transactional (readOnly = true) lleva a LazyInitializationException
- 10. ¿Cómo encontrar su propietario DataGrid y DataGridRow de DataGridCell en WPF?
- 11. Obteniendo un control de una DataGridCell
- 12. Haciendo Django Readonly ForeignKey Campo en Admin Render como un enlace
- 13. Haga la sesión readonly en asp.net programmatically (EnableSessionState = "ReadOnly")
- 14. DateTime.Today y "static readonly"
- 15. Spring - Transaction Readonly
- 16. readonly con jquery
- 17. Conéctese condicionalmente a una base de datos
- 18. Agregar condicionalmente htmlAttributes a ASP.NET MVC Html.ActionLink
- 19. cómo reenviar UIWebView desplácese a UIScrollView? (condicionalmente)
- 20. Readonly ComboBox en WinForms
- 21. C# readonly objeto
- 22. haciendo referencia a System.Windows.Automation
- 23. NSString property copy or readonly?
- 24. WPF - Haciendo que los hipervínculos se puedan hacer clic
- 25. Mostrar RowDetails haciendo doble clic en WPF DataGrid
- 26. Filtrar condicionalmente una secuencia
- 27. permite condicionalmente constructor
- 28. Private Static Readonly Field Capitalization
- 29. Comportamiento de una propiedad readOnly
- 30. Haciendo múltiples llamadas a fb.api
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
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
@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