11
votes

WPF DataGrid Rowdetailt SteilPlate Visibilité lié à une propriété

J'utilise un document WPF DataGrid avec un panneau RowDetails où la carte RowdetailsVisibilité est réglée sur "VisibleQueLued" et la sélectionMode = "étendue" de sorte que plusieurs lignes peuvent être sélectionnées et que plusieurs lignes peuvent être sélectionnées, comme ci-dessous:

<dg:DataGrid x:Name="MyGrid"
             ItemsSource="{Binding Path=MyItems}"
             AutoGenerateColumns="True"
             SelectionMode="Extended"
             RowDetailsVisibilityMode="VisibleWhenSelected">

  <dg:DataGrid.RowDetailsTemplate>
    <DataTemplate>
      <TextBlock Text="Further Details..."/>
    </DataTemplate>
  </dg:DataGrid.RowDetailsTemplate>
  ...
</dg:DataGrid>


0 commentaires

3 Réponses :


14
votes

En regardant le code source de la boîte à outils WPF Chaque DataGridrow dispose d'une propriété de détailsSIPIBILITY.

I Mettez un bouton (juste pour tester) dans la première colonne. p> xxx pré>

Lorsque le bouton est cliqué, recherchez la ligne cliquée et activez la propriété. P>

   private void Details_Click(object sender, RoutedEventArgs e)
    {
      try
      {
        // the original source is what was clicked.  For example 
        // a button.
        DependencyObject dep = (DependencyObject)e.OriginalSource;

        // iteratively traverse the visual tree upwards looking for
        // the clicked row.
        while ((dep != null) && !(dep is DataGridRow))
        {
          dep = VisualTreeHelper.GetParent(dep);
        }

        // if we found the clicked row
        if (dep != null && dep is DataGridRow)
        {
          // get the row
          DataGridRow row = (DataGridRow)dep;

          // change the details visibility
          if (row.DetailsVisibility == Visibility.Collapsed)
          {
            row.DetailsVisibility = Visibility.Visible;
          }
          else
          {
            row.DetailsVisibility = Visibility.Collapsed;
          }
        }
      }
      catch (System.Exception)
      {
      }
    }


2 commentaires

Merci Rory, belle solution. C'est exactement ce que je voulais, j'avais tort de penser en termes de liaison à une propriété dans mon point de vue, car il s'agit de la fonctionnalité purement visualisée. La méthode fonctionne donc dans l'événement de clic de la case à cocher est parfaite.


Cela fonctionne également pour Silverlight si vous définissez le fichier DataGrid.rowdetails initialVisibilitéMode = "effondré"



10
votes

Utilisation de PURE XAML (+ un convertisseur):

xaml: xxx

convertisseur: xxx


2 commentaires

+1 Pour une approche XAML uniquement, car il est plus facile de s'appliquer à plusieurs endroits et est plus portable lorsque vous déplacez DataGrid XAML.


Cela fonctionne bien lorsque vous définissez le RowdetailsVisibilitéMode à effondrer.



0
votes

Si vous utilisez la bibliothèque (excellente) convertisseurs Lambda, vous pouvez enregistrer la classe supplémentaire. Ce convertisseur utilise 2 expressions Lambda, la première pour la convertie, la seconde pour la reconverte, par exemple: xxx pré>

puis le XAML est la suivante (note qu'il n'y a pas besoin de staticresources lors de l'utilisation de cette approche): p>

     <DataGrid.RowHeaderTemplate>
            <DataTemplate>
                <ToggleButton>
                    <ToggleButton.IsChecked>
                        <Binding RelativeSource="{RelativeSource AncestorType={x:Type DataGridRow}}" Path="DetailsVisibility"
                                 Converter="{x:Static lc40:Converters.VisibilityToBoolean}"/>
                    </ToggleButton.IsChecked>
                </ToggleButton>
            </DataTemplate>
        </DataGrid.RowHeaderTemplate>


0 commentaires