2010-05-04 9 views
4

Je vois quelques options disponibles pour la sélection de ligne, mais 'Aucune sélection' n'en fait pas partie. J'ai essayé de gérer l'événement SelectionChanged en définissant SelectedItem sur null, mais la ligne semble toujours sélectionnée.Comment puis-je empêcher la sélection de ligne dans le DataGrid Toolkit WPF?

S'il n'y a pas de support facile pour empêcher cela, serait-il facile de simplement styliser la rangée sélectionnée comme une ligne non sélectionnée? De cette façon, il pourrait être sélectionné, mais l'utilisateur n'a aucun indicateur visuel.

+0

Voulez-vous faire lecture seule? – Archie

+0

Il est déjà en lecture seule. J'ai été capable de le faire facilement à travers les propriétés sur les cellules. Je ne veux pas autoriser la sélection de ligne. Je commence à penser que styliser les lignes sélectionnées de la même façon que les lignes non sélectionnées pourrait être la réponse. – Kilhoffer

Répondre

5

Vous devez appeler DataGrid.UnselectAll de manière asynchrone avec BeginInvoke pour le faire fonctionner. J'ai écrit ce qui suit bien attaché à gérer ceci:

using System; 
using System.Windows; 
using System.Windows.Threading; 
using Microsoft.Windows.Controls; 

namespace DataGridNoSelect 
{ 
    public static class DataGridAttach 
    { 
     public static readonly DependencyProperty IsSelectionEnabledProperty = DependencyProperty.RegisterAttached(
      "IsSelectionEnabled", typeof(bool), typeof(DataGridAttach), 
      new FrameworkPropertyMetadata(true, IsSelectionEnabledChanged)); 
     private static void IsSelectionEnabledChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
     { 
      var grid = (DataGrid) sender; 
      if ((bool) e.NewValue) 
       grid.SelectionChanged -= GridSelectionChanged; 
      else 
       grid.SelectionChanged += GridSelectionChanged; 
     } 
     static void GridSelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
     { 
      var grid = (DataGrid) sender; 
      grid.Dispatcher.BeginInvoke(
       new Action(() => 
       { 
        grid.SelectionChanged -= GridSelectionChanged; 
        grid.UnselectAll(); 
        grid.SelectionChanged += GridSelectionChanged; 
       }), 
       DispatcherPriority.Normal, null); 
     } 
     public static void SetIsSelectionEnabled(DataGrid element, bool value) 
     { 
      element.SetValue(IsSelectionEnabledProperty, value); 
     } 
     public static bool GetIsSelectionEnabled(DataGrid element) 
     { 
      return (bool)element.GetValue(IsSelectionEnabledProperty); 
     } 
    } 
} 

Je sourced this blog post dans la création de ma solution.

+0

Ceci est une solution géniale à un problème étrange. Si je pouvais t'avoir plus d'une fois, je le ferais! Travaillé parfaitement. – Kilhoffer

+0

+1, mais assez hacky :-) – Karsten

0

Toute sélection de ligne peut être évitée en utilisant la propriété 'IsHitTestVisible' comme Faux. Mais il ne vous permettra pas d'utiliser la barre de défilement de votre grille de données. Datagrid sera verrouillé dans ce cas. Une autre solution est: Vous pouvez appliquer un style à la cellule de DataGrid. Cela a fonctionné pour moi. S'il vous plaît utiliser le code comme ci-dessous:
code ci-dessus a fonctionné pour moi. J'espère que cela fonctionnera pour vous aussi.

Cordialement, Vaishali

1

S'il vous plaît descendre en dessous de style à la cellule datagid pour résoudre le problème:

<Style x:Key="MyDatagridCellStyle" TargetType="{x:Type Custom:DataGridCell}"> 
     <Setter Property="Focusable" Value="false"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="Foreground" Value="#434342"/> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Setter Property="FontFamily" Value="Arial"/> 
     <Setter Property="FontSize" Value="11"/> 
     <Setter Property="FontWeight" Value="Normal"/> 
</Style> 
Questions connexes