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>
3 Réponses :
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> 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)
{
}
}
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é"
Utilisation de PURE XAML (+ un convertisseur):
xaml: p> convertisseur: p>
+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.
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: 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>