c# - Deshabilitar la selección en WPF DataGrid
focus selection (10)
Como señala Sonic Soul here , la solución de viky en realidad no funciona.
Aquí está el código de trabajo real para deshabilitar la selección en un DataGrid:
grid.SelectionChanged += (obj, e) =>
Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
grid.UnselectAll()));
¿Cómo puedo desactivar la selección en un DataGrid
de WPFTooklit? Traté de modificar la solución que funciona para ListView
(de WPF ListView desactiva selección ), pero eso no funciona:
<tk:DataGrid>
<tk:DataGrid.ItemContainerStyle>
<Style TargetType="{x:Type tk:DataGridRow}">
<Setter Property="Focusable" Value="false"/>
</Style>
</tk:DataGrid.ItemContainerStyle>
<tk:DataGrid.CellStyle>
<Style TargetType="{x:Type tk:DataGridCell}">
<Setter Property="Focusable" Value="false"/>
</Style>
</tk:DataGrid.CellStyle>
</tk:DataGrid>
En caso de que esté utilizando colores alternativos:
<Style TargetType="{x:Type DataGrid}">
<Setter Property="RowBackground" Value="#badeee"/>
<Setter Property="AlternationCount" Value="2" />
<Setter Property="AlternatingRowBackground" Value="#92cce5"/>
</Style>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type DataGridRow}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="#badeee"></Setter>
<Setter Property="BorderBrush" Value="#badeee"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="#92cce5"></Setter>
<Setter Property="BorderBrush" Value="#92cce5"></Setter>
</Trigger>
</Style.Triggers>
</Style>
Hay un truco para esto. Puede manejar el evento SelectionChanged de DataGrid (digamos dgGrid) y en el controlador escribir:
dgGrid.UnselectAll();
Se deseleccionará toda la fila seleccionada y el resultado será "Sin fila seleccionada".
La única forma adecuada que encontré para hacer esto es deshabilitar la propiedad IsHitTestVisible en DataGrid Row Style.
Los eventos de clics seguirán registrándose a pesar de la nomenclatura. Asegúrese de no cambiar esta propiedad en todo el DataGrid a menos que también desee deshabilitar el desplazamiento.
Una forma limpia de hacer esto es a través de un nuevo Estilo en sus recursos estáticos (copiando otros adaptadores según corresponda)
<Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
y luego vincularlo en su DataGrid
<DataGrid
RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
<!-- Contents -->
</DataGrid>
La forma limpia sería, simplemente anular los estilos de la fila y la celda
<DataGrid.Resources>
<ResourceDictionary>
<Style x:Key="{x:Type DataGridCell}" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{x:Null}" />
<Setter Property="BorderBrush" Value="{x:Null}" />
</Trigger>
</Style.Triggers>
</Style>
</ResourceDictionary>
</DataGrid.Resources>
Otra forma simple es cambiar el Estilo de Selección con un Disparador Seleccionado a Transparente.
Para deshabilitar por completo la selección de filas en un DataGrid, puede hacer lo siguiente:
<DataGrid>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsHitTestVisible" Value="False"/>
</Style>
</DataGrid.RowStyle>
<!--Other DataGrid items-->
</DataGrid>
Esto podría considerarse más favorable que establecer <Setter Property="IsEnabled" Value="False"/>
debido al hecho de que al hacer la técnica antes mencionada ocasiona que cambie el estilo de la fila. Tampoco deshabilita la aparición de menús contextuales al hacer clic con el botón derecho.
Por último: es importante tener en cuenta que establecer " IsHitTestVisible " en "False" deshabilita toda interacción con las filas, incluida la edición.
Sin embargo, si todo lo que desea hacer es cambiar el estilo de la fila cuando se selecciona, consulte las respuestas here .
Si alguien más enfrenta el mismo problema, pueden encontrarlo útil.
Tuvimos el requerimiento de deshabilitar algunas filas en la cuadrícula de datos, pero al mismo tiempo permitimos la navegación con la tecla de FLECHA sobre ellas. Es por eso que tuvimos que cambiar a ''IsHitTestVisible'' en lugar de controlar la propiedad ''IsEnabled''. Entonces no podríamos adoptar la solución anterior de cambiar a la propiedad ''IsEnable''.
Así es como terminé resolviendo este problema. Creé una nueva propiedad adjunta (RowEnable) para DataGridRow. Esta propiedad adjunta se puede vincular a una propiedad de modelo de vista para controlar la habilitación e inhabilitación ''virtual''. También creé un nuevo estilo para DataGridCell en el que estoy configurando ''IsHitTestVisible'' como falso en función de la misma propiedad de viewmodel. Por lo tanto, considérelo como una fila que el mouse / teclado puede ver, pero no puede ver sus celdas / columnas. Esto significa que ahora puedo diseñar la fila según la nueva propiedad adjunta (RowEnabled) para que parezca deshabilitada / habilitada. Al mismo tiempo, puedo ver información sobre herramientas para estas filas que están virtualmente deshabilitadas.
Simplemente agregue IsHitTestVisible="False"
a la definición de DataGrid
.
Todas las anteriores son buenas ideas para hacks fáciles. Sin embargo, no están haciendo exactamente lo que se les pide. Las otras respuestas nos dicen cómo deseleccionar algo seleccionado por el usuario u ocultar el hecho de que algo fue seleccionado por el usuario.
Sin embargo, entiendo por qué se dan estas respuestas. No es fácil proporcionar la solución real.
La solución real es evitar la selección en primer lugar, que no es sencilla, pero que es factible con unos pocos pasos sencillos.
Respuesta 1. Debe copiar el estilo en Expression Blend (o buscar una copia del estilo en algún lugar). 2. Cambie una sola configuración de ItemPresenter. Fue suficiente para mí configurar IsHitTestVisible = "False" en el ItemPresenter.
Si necesita más detalles, o un recorrido detallado para hacer esto, vea la publicación de mi blog:
¿Cómo deshabilitar la selección de filas en un WGD DataGrid?