using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Media; namespace DataGridCollapsed { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Expander_Expanded(object sender, RoutedEventArgs e) { for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) if (vis is DataGridRow) { var row = (DataGridRow)vis; row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; break; } } private void Expander_Collapsed(object sender, RoutedEventArgs e) { for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual) if (vis is DataGridRow) { var row = (DataGridRow)vis; row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; break; } } } public class ViewModel : INotifyPropertyChanged { private CollectionViewSource cvs = new CollectionViewSource(); private ObservableCollection persons = new ObservableCollection(); public ObservableCollection Persons { get { return persons; } set { persons = value; OnPropertyChanged(); } } private Person selectedPerson = null; public Person SelectedPerson { get => this.selectedPerson; set { this.selectedPerson = value; OnPropertyChanged(); } } public ICollectionView View { get { if (cvs.Source == null) { GetData(); cvs.View.CurrentChanged +=(s,e)=> SelectedPerson = cvs.View.CurrentItem as Person; } return cvs.View; } } private void GetData() { for (int i = 1; i < 6; i++) { Person p = new Person { ID = i, Name = $"Name {i}" }; Persons.Add(p); for (int j = 0; j < 5; j++) p.Details.Add(new Detail() { Title = "title", Address = $"Address{j}" }); } cvs.Source = Persons; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public class Person { public int ID { get; set; } public string Name { get; set; } public ObservableCollection Details { get; set; } = new ObservableCollection(); } public class Detail { public string Title { get; set; } public string Address { get; set; } } }