Désactiver la sélection dans la grille de données du FPF

comment désactiver la sélection dans un WPFTooklit DataGrid ? J'ai essayé de modifier la solution qui fonctionne pour ListView (de WPF ListView turn off selection ), 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>
40
demandé sur Community 2010-03-23 03:49:18

10 réponses

il y a un truc pour ça. Vous pouvez gérer L'événement modifié par sélection du DataGrid (disons dgggrid) et dans le gestionnaire écrire:

dgGrid.UnselectAll();

il désélectionnera toutes les lignes sélectionnées et le résultat sera"Aucune ligne sélectionnée".

-5
répondu viky 2010-03-23 18:19:33

la manière propre serait, pour juste outrepasser les styles de la rangée et 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>
28
répondu Alex 2014-05-09 09:52:49

il suffit d'ajouter IsHitTestVisible="False" à la définition de DataGrid .

16
répondu Yuri Bondarenko 2013-06-12 10:01:33

Tout ce qui précède sont de bonnes idées pour les hacks faciles. Cependant, ils ne font pas exactement ce qu'on leur demande. Les autres réponses nous disent comment désélectionner quelque chose sélectionné par l'utilisateur ou cacher 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 solution réelle.

la vraie solution est d'empêcher la sélection en premier lieu, ce qui n'est pas simple, mais c'est faisable avec quelques étapes faciles.

réponse 1. Vous devez copier le style dans le mélange D'Expression (ou trouver une copie du style quelque part). 2. Changez le paramètre ItemPresenter. Il me suffisait de placer IsHitTestVisible="False" sur le ItemPresenter.

si vous avez besoin de plus de détails, ou un walk-thru en profondeur pour ce faire, voir mon billet de blog:

Comment désactiver la sélection d'une ligne dans un WPF DataGrid?

10
répondu Rhyous 2011-05-24 19:23:13

pour désactiver complètement la sélection de lignes dans un DataGrid, vous pouvez faire ce qui suit:

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

cela pourrait être considéré plus favorable que le réglage <Setter Property="IsEnabled" Value="False"/> en raison du fait que faire la technique susmentionnée provoque le style de la rangée de changer. Il n'empêche pas non plus les menus de contexte d'apparaître en cliquant avec le bouton droit de la souris.

enfin: il est important de noter que le réglage" IsHitTestVisible " à "Faux" désactive tous interaction avec les lignes, y compris l'édition.

cependant, si tout ce que vous voulez faire est de changer le style de la rangée une fois sélectionné, s'il vous plaît voir les réponses ici .

9
répondu Joshua 2017-05-23 12:34:47

comme l'a souligné Sonic Soul ici , la solution de viky ne fonctionne pas réellement.

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
répondu Ray Burns 2017-05-23 10:31:35

une autre façon simple est de changer le Style de sélection avec un déclencheur choisi par IsSelected en Transparent.

4
répondu Mr. Snuggles 2010-07-25 14:08:33

Dans le cas où vous utilisez d'autres couleurs:

<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
répondu silver_mx 2017-05-21 22:10:26

la seule façon correcte que j'ai trouvé de faire ceci est de désactiver ishittestvisible propriété sur DataGrid Row Style.

les événements de clic s'enregistreront malgré le nom. Assurez-vous de ne pas changer cette propriété sur L'ensemble du DataGrid à moins que vous ne vouliez également désactiver le défilement.

une façon propre de faire ceci est à travers un nouveau Style dans vos ressources statiques (copier d'autres setters comme approprié)

        <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>
2
répondu Mindaugas-kun 2017-06-15 15:43:59

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

nous avions l'exigence de désactiver quelques lignes sur datagrid, mais en même temps permettre la navigation par touche Flèche sur eux. 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 de 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é jointe peut être liée à une propriété viewmodel pour contrôler l'activation et la désactivation "virtuelle". J'ai aussi créé un nouveau style pour DataGridCell où je mets 'IsHitTestVisible' à false basé sur la même propriété viewmodel. Ainsi, considérez - le comme une rangée que la souris/clavier peut voir, mais ne peut pas voir ses cellules/colonnes. Cela signifie que maintenant je peux modeler la ligne en fonction de la nouvelle propriété attachée (RowEnabled) pour avoir l'air Désactivé/Activé. En même temps, je peux voir tooltips pour ces lignes qui sont pratiquement désactivé.

0
répondu Vipin Gupta 2015-05-17 18:23:44