web-dev-qa-db-fra.com

Désactiver la sélection dans WPF DataGrid

Comment désactiver la sélection dans DataGrid? .__ de WPFTooklit. J'ai essayé de modifier la solution qui fonctionne pour ListView (à partir de WPF ListView désactive la sélection ), mais cela ne fonctionne pas:

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

La façon propre serait, pour simplement remplacer les styles de la ligne et de la cellule

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

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

17
Yuri

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

<DataGrid>
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>
    </DataGrid.RowStyle>
    <!--Other DataGrid items-->
</DataGrid>

Cela pourrait être considéré comme plus favorable que la définition de <Setter Property="IsEnabled" Value="False"/> car cette technique entraîne le changement de style de la ligne. Cela ne désactive pas non plus les menus contextuels d'apparaître lorsque vous cliquez avec le bouton droit. 

Enfin, il est important de noter que définir " IsHitTestVisible " sur "False" désactive toute interaction all avec les lignes, y compris l'édition.

Toutefois, si vous souhaitez simplement modifier le style de la ligne sélectionnée, affichez les réponses ici .

11
Joshua

Tout ce qui précède est de bonnes idées pour des hacks faciles. Cependant, ils ne font pas exactement ce qui est demandé. Les autres réponses nous disent comment désélectionner quelque chose sélectionné par l'utilisateur ou masquer le fait que quelque chose a été sélectionné par l'utilisateur.

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

Réponse 1. Vous devez copier le style dans Expression Blend (ou en trouver une copie quelque part) . 2. Modifier 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 le faire, consultez mon article de blog:

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

10
Rhyous

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())); 
7
Ray Burns

Si vous utilisez des couleurs alternatives:

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

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

4
Mr. Snuggles

Le seul moyen approprié que j’ai trouvé est de désactiver la propriété IsHitTestVisible sur DataGrid Row Style. 

Les événements de clic seront toujours enregistrés malgré le nom. Assurez-vous de ne pas modifier cette propriété sur l'ensemble du DataGrid, sauf si vous souhaitez également désactiver le défilement. 

Pour ce faire, utilisez un nouveau style dans vos ressources statiques (en copiant d'autres paramètres, le cas échéant).

        <Style x:Key="DataGridUnselectableRowStyle" TargetType="{x:Type DataGridRow}">
            <Setter Property="IsHitTestVisible" Value="False"/>
        </Style>

et ensuite le lier sur votre DataGrid

        <DataGrid
            RowStyle="{StaticResource DataGridUnselectableRowStyle}" >
            <!-- Contents -->
        </DataGrid>
3
Mindaugas-kun

Si quelqu'un d'autre fait face au même problème, il peut le trouver utile. 

Nous devions désactiver quelques lignes sur la grille de données, tout en permettant la navigation par touche de direction ARROW. C'est pourquoi nous avons dû passer à 'IsHitTestVisible' au lieu de contrôler la propriété 'IsEnabled'. Nous ne pouvions donc pas adopter la solution ci-dessus consistant à 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, dans lequel je règle 'IsHitTestVisible' sur false en fonction de la même propriété viewmodel. Alors, considérez cela comme une ligne que la souris/le clavier peut voir, mais ne peut pas voir ses cellules/colonnes. Cela signifie que je peux maintenant attribuer un style à la ligne en fonction de la nouvelle propriété attachée (RowEnabled) afin qu'elle soit désactivée/activée. En même temps, je peux afficher des info-bulles pour ces lignes qui sont pratiquement désactivées.

0
Vipin Gupta