2010-08-09 12 views
1

J'ai un DataGrid (l'officiel) avec SelectionUnit="Cell". Lorsque l'utilisateur sélectionne une cellule, je souhaite afficher les détails de la ligne correspondant à la ligne correspondante. Ce n'est apparemment pas le comportement par défaut, et je n'arrive pas à comprendre comment y parvenir.Affichage de RowDetails par programme

Voici mon XAML:

<UserControl x:Class="View.Test" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="../AppResources.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" 
       ItemsSource="{Binding Path=Fields}" 
       BorderBrush="Transparent" 
       HeadersVisibility="Column" 
       SelectionMode="Single" 
       SelectionUnit="Cell" 
       CanUserAddRows="False" 
       CanUserDeleteRows="False" 
       CanUserSortColumns="False" 
       IsTextSearchEnabled="True" 
       x:Name="EntryGrid" 
       > 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="Auto" IsReadOnly="True"/> 
       <DataGridTemplateColumn Header="Value" Width="Auto" x:Name="valueColumn" MinWidth="60" MaxWidth="90"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Path=DisplayValue}" TextTrimming="CharacterEllipsis" ToolTip="{Binding Path=Text, RelativeSource={RelativeSource Self}}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
        <DataGridTemplateColumn.CellEditingTemplate> 
         <DataTemplate> 
          <DockPanel> 
           <ComboBox TabIndex="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" SelectedValue="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Value" ItemsSource="{Binding Path=FieldOptions}" Visibility="{Binding Path=FieldOptions, Converter={StaticResource EmptyCollectionIsInvisibleConverter}}" /> 
           <TextBox TabIndex="2" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Stretch" Visibility="{Binding Path=FieldOptions, Converter={StaticResource NonEmptyCollectionIsInvisibleConverter}}"/> 
          </DockPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellEditingTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Description" IsReadOnly="True" Width="*" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Description}" TextWrapping="Wrap" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Path=Help}" /> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </Grid> 
</UserControl> 

Répondre

4

Vous pouvez définir le SelectionUnit à FullRow

SelectionUnit="FullRow" 

ou vous pouvez gérer l'événement de sélection et définir la visibilité sur la gestion des événements.

private void EntryGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) 
    { 
     foreach (var cell in e.AddedCells) 
     ((DataGridRow)EntryGrid.ItemContainerGenerator.ContainerFromItem(cell.Item)).DetailsVisibility = System.Windows.Visibility.Visible; 
     foreach (var cell in e.RemovedCells) 
      ((DataGridRow)EntryGrid.ItemContainerGenerator.ContainerFromItem(cell.Item)).DetailsVisibility = System.Windows.Visibility.Collapsed; 
    } 

Insérez ici des remarques désobligeantes sur le composant DataGrid WPF.

+0

Wow, comment avez-vous compris cela? Il semble qu'il y ait très peu d'informations sur le DataGrid. J'apprécierais les liens vers des articles ou des échantillons que vous avez trouvés utiles. C'est un morceau de code tellement simple, et je ne l'aurais jamais trouvé. – notJim

+0

Je travaille beaucoup avec le DataGrid depuis 2 mois. J'ai trouvé exactement ce que vous venez de dire: il y a très peu d'informations après les bases. Il est très utile de simplement plonger dans la source WPF Toolkit. – jrwren