Désactiver la sélection dans WPF DataGrid

Comment puis-je désactiver la sélection dans le DataGrid un WPFTooklit? J’ai essayé de modifier la solution qui fonctionne pour ListView (à partir de la sélection de désactivation de WPF ListView ), mais cela ne fonctionne pas:

             

Il y a un truc pour cela. Vous pouvez gérer l’événement SelectionChanged du DataGrid (disons dgGrid) et dans le gestionnaire d’écriture:

 dgGrid.UnselectAll(); 

Il désélectionnera toutes les lignes sélectionnées et le résultat sera “Aucune ligne sélectionnée”.

La manière propre serait de simplement remplacer les styles de la rangée et de la cellule

       

Ajoutez simplement IsHitTestVisible="False" à la définition de DataGrid .

Tout ce qui précède sont de bonnes idées pour les piratages faciles. Cependant, ils ne font pas exactement ce qui est demandé. Les autres réponses nous indiquent comment désélectionner un élément sélectionné par l’utilisateur ou masquer le fait que l’utilisateur a sélectionné quelque chose.

Cependant, je comprends pourquoi ces réponses sont données. Il n’est pas facile de fournir la vraie solution.

La vraie solution consiste à empêcher la sélection en premier lieu, ce qui n’est pas simple mais réalisable en quelques étapes simples.

Réponse 1. Vous devez copier le style dans Expression Blend (ou trouver une copie du style quelque part). 2. Modifiez un seul paramètre ItemPresenter. Il me suffisait de définir IsHitTestVisible = “False” sur ItemPresenter.

Si vous avez besoin de plus de détails ou d’un guide détaillé pour ce faire, consultez mon article sur le blog:

Comment désactiver la sélection de lignes dans un DataGrid WPF?

Pour désactiver complètement la sélection de lignes dans un DataGrid, vous pouvez procéder comme suit:

       

Cela pourrait être considéré comme plus favorable que la définition de car la technique mentionnée ci-dessus modifie le style de la ligne. Il ne désactive pas non plus l’apparition des menus contextuels lors d’un clic droit.

Enfin: il est important de noter que la définition de ” False ” sur ” IsHitTestVisible ” désactive toutes les interactions avec les lignes, y compris l’édition.

Cependant, si tout ce que vous voulez faire est de changer le style de la ligne quand vous le sélectionnez, veuillez voir les réponses ici .

Comme le souligne Sonic Soul ici , la solution de viky ne fonctionne pas vraiment.

Voici le code de travail réel pour désactiver la sélection dans un DataGrid:

 grid.SelectionChanged += (obj, e) => Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() => grid.UnselectAll())); 

Un autre moyen simple consiste à modifier le style de sélection avec un déclencheur IsSelected sur Transparent.

Si vous utilisez des couleurs alternatives:

    

La seule façon correcte de le faire est de désactiver la propriété IsHitTestVisible sur le style de ligne DataGrid.

Les événements de clic continueront à s’inscrire malgré la dénomination. Assurez-vous de ne pas modifier cette propriété sur l’ensemble du DataGrid sauf si vous souhaitez également désactiver le défilement.

Une manière propre de procéder consiste à utiliser un nouveau style dans vos ressources statiques (en copiant les autres programmes selon les besoins).

   

puis le lier sur votre DataGrid

     

Si quelqu’un d’autre fait face au même problème, ils peuvent le trouver utile.

Nous avions besoin de désactiver quelques lignes sur la grid de données, tout en autorisant la navigation dans les touches FLÉCHÉES. C’est pourquoi nous avons dû passer à ‘IsHitTestVisible’ au lieu de contrôler la propriété ‘IsEnabled’. Nous n’avons donc pas pu adopter la solution ci-dessus pour passer à la propriété “IsEnable”.

Voici comment j’ai fini par résoudre ce problème. J’ai créé une nouvelle propriété attachée (RowEnable) pour DataGridRow. Cette propriété attachée peut être liée à une propriété viewmodel pour contrôler l’activation et la désactivation “virtuelles”. J’ai également créé un nouveau style pour DataGridCell où je mets ‘IsHitTestVisible’ sur false en fonction de la même propriété viewmodel. Alors, considérez-le comme une ligne que la souris / le clavier peut voir, mais ne peut pas voir ses cellules / colonnes. Cela signifie que je peux désormais définir la ligne en fonction de la nouvelle propriété jointe (RowEnabled) pour qu’elle soit désactivée / activée. Dans le même temps, je peux afficher des info-bulles pour ces lignes qui sont virtuellement désactivées.