2009-10-30 3 views
3

J'ai un DataGrid que je lie à un PagedCollectionView qui est groupé et trié. Le contenu du DataGrid n'est pas modifiable bien qu'une colonne contienne un lien cliquable.Création de cellules Datagrid Silverlight non sélectionnables

J'ai limité la SelectionMode du DataGrid à DataGridSelectionMode.Single qui arrête la sélection multiple de la ligne qui est bon. Mais la ligne sélectionnée a également une cellule sélectionnée qui dessine une couleur légèrement plus claire que le reste de la ligne sélectionnée et a une bordure.

Fondamentalement, je voudrais avoir un SelectedRow mais pas un SelectedCell (à partir d'une perspective UI/affichage).

Il semble que la définition d'une propriété soit simple, mais j'ai l'impression que je dois peut-être modifier le modèle DataGrids et/ou créer un désordre avec VisualStateManager.

Je suis heureux de passer à un autre contrôle autre que DataGrid mais je dois être en mesure d'afficher Groupement.

Répondre

6

Je trouve « une » façon de faire les cellules individuelles semblent pas sélectionné, même si je ne sais pas si c'est la meilleure façon.
Modifiez le CellStyle pour le contrôle DataGrid, recherchez le rectangle nommé FocusVisual. C'est le rectangle utilisé pour indiquer une cellule sélectionnée. Définir son remplissage & Stroke à Transparent, j'ai également mis son StrokeThickness à 0. Ne supprimez pas le Rectangle entièrement parce que d'autres choses attendent qu'il soit là. Le XAML avait l'air quelque chose comme ceci:

<Style x:Key="NonSelectableDataGridCellStyle" TargetType="data:DataGridCell"> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
     <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
     <Setter Property="IsTabStop" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="data:DataGridCell"> 
        <Grid x:Name="Root" Background="{TemplateBinding Background}"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition Width="Auto"/> 
         </Grid.ColumnDefinitions> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CurrentStates"> 
           <VisualState x:Name="Regular"/> 
           <VisualState x:Name="Current"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" 
              Storyboard.TargetName="FocusVisual" 
              Storyboard.TargetProperty="Opacity" To="1"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="ValidationStates"> 
           <VisualState x:Name="Valid"/> 
           <VisualState x:Name="Invalid"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" Storyboard.TargetName="InvalidVisualElement" Storyboard.TargetProperty="Opacity" To="1"/> 
             <ColorAnimation Duration="0" Storyboard.TargetName="FocusVisual" Storyboard.TargetProperty="(Fill).Color" To="#FFFFFFFF"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Rectangle x:Name="FocusVisual" 
          Fill="Transparent" 
          Stroke="Transparent" 
          StrokeThickness="0" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          IsHitTestVisible="false" 
          Opacity="0" 
            /> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/> 
         <Rectangle x:Name="InvalidVisualElement" Stroke="#FFDC000C" StrokeThickness="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsHitTestVisible="False" Opacity="0"/> 
         <Rectangle x:Name="RightGridLine" VerticalAlignment="Stretch" Width="1" Grid.Column="1"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

et que vous ajoutez le CellStyle au DataGrid

<data:DataGrid x:Name="uiDataGrid" 
      CellStyle="{StaticResource NonSelectableDataGridCellStyle}" 
      > 
    ... 
</data:DataGrid> 
2

Vous pouvez également ajouter la colonne "invisible":

<sdk:DataGrid.Columns> 
    <sdk:DataGridTextColumn Binding="{Binding Path=Nothing}" MinWidth="0" MaxWidth="0" /> 

Et faire en cours chaque fois que la cellule en cours est modifiée:

Private Sub _CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.CurrentCellChanged 
    If Me.CurrentColumn IsNot Nothing Then Me.CurrentColumn = Me.Columns(0) 
End Sub 

Cela me convenait.

+0

Très rusé, mais je me sens un peu sale. Probablement plus agréable que des tonnes de modèles de contrôle. –