2017-10-19 18 views
0

Je souhaite ajouter un indicateur de flèche à la ligne actuellement sélectionnée dans un WPF DataGrid. Je suis prêt à changer si quelqu'un a une meilleure approche, mais ce que j'allais faire ce qui utilisent un DataGridTemplateColumn et utilisent deux styles différents pour la cellule et la ligne.Possible de changer le style de cellule quand on clique sur la ligne WPF DataGrid?

<DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" MaxLength="20" /> 
       <TextBox Name="txtArrow" Text="&#x21E8;" HorizontalAlignment="Stretch" Visibility="{Binding IsRowSelected, Converter={StaticResource booleanToVisibility}}" /> 
      </StackPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Fondamentalement, je veux la zone de texte txtArrow pour montrer que pour la ligne sélectionnée dans la grille de données. Je me demande si cela peut être réalisé via XAML pur et styles. Je sais WPF a un indicateur de ligne hors de la boîte dans la colonne la plus à gauche, mais malheureusement, je dois faire l'indicateur sur le côté droit de la première colonne txtID. Est-ce possible?

Merci!

+0

Votre approche semble bien pour moi. –

Répondre

0

Au lieu de changer le style, j'ai utilisé un MultiDataTrigger pour montrer l'indicateur de flèche Je veux d'après ce que la ligne est sélectionnée dans la grille de données. Que ce soit la meilleure solution ou non est sujet à débat, mais l'indicateur de ligne est simplement un caractère de texte flèche dans une grille (plutôt qu'un panneau de pile) dans ma cellule qui partage l'espace avec une autre zone de texte. Code ci-dessous:

<DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False"> 
<DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
      <Grid.ColumnDefinition Width="*" /> 
      <Grid.ColumnDefinition Width="*" /> 
      <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" MaxLength="20" /> 
      <TextBox Name="txtArrow" HorizontalAlignment="Stretch"> 
       <TextBox.Style> 
        <Style TargetType="TextBox" BaseOn="{StaticResource MyTextBoxStyle}"> 
         <Style.Triggers> 
          <MultiDataTrigger> 
           <MultiDataTrigger.Conditions> 
            <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}, Path=IsSelected}" Value="True" /> 
           </MultiDataTrigger.Conditions> 
           <Setter Property="Text" Value="--&gt;" /> 
          </MultiDataTrigger> 
         </Style.Triggers> 
        </Style> 
       </TextBox.Style> 
      </TextBox> 
     </Grid> 
    </DataTemplate> 
</DataGridTemplateColumn.CellTemplate> 

0
<DataGrid> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="ID" Width="50" CanUserSort="False"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBox Name="txtID" Text="{Binding ID, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Stretch" MaxLength="20" /> 
         <TextBox Name="txtArrow" Text="&#x21E8;" HorizontalAlignment="Stretch"> 
          <TextBox.Visibility> 
           <Binding Path="IsSelected" RelativeSource="{RelativeSource AncestorType=DataGridRow}"> 
            <Binding.Converter> 
             <BooleanToVisibilityConverter/> 
            </Binding.Converter> 
           </Binding> 
          </TextBox.Visibility> 
         </TextBox> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>