Hi, there can only be one active, selected cell in a DataGrid. The current line in the outer DataGrid and in the inner DataGrid can be captured and processed. Try following demo:
<Window x:Class="Window034"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1.WpfApp034"
mc:Ignorable="d"
Title="Demo 75947307" Height="450" Width="800">
<Window.Resources>
<local:ViewModel x:Key="vm"/>
</Window.Resources>
<Grid DataContext="{StaticResource vm}">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
<DataGridTextColumn Header="Info" Binding="{Binding Info}"/>
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding DetailView, Source={StaticResource vm}}" IsReadOnly="True"/>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
<Label Grid.Row="1" Content="{Binding Log}"/>
</Grid>
</Window>
--------------------------------------------------------
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Namespace WpfApp034
Public Class ViewModel
Implements INotifyPropertyChanged
Private cvs As New CollectionViewSource
Private col As New ObservableCollection(Of Data)
Public ReadOnly Property View As ICollectionView
Get
If cvs.Source Is Nothing Then
GetData()
AddHandler cvs.View.CurrentChanged, Sub()
CurrentItem = TryCast(cvs.View.CurrentItem, Data)
End Sub
End If
Return cvs.View
End Get
End Property
Private cvsDetail As New CollectionViewSource
Public ReadOnly Property DetailView As ICollectionView
Get
Return cvsDetail.View
End Get
End Property
Private _currentItem As Data
Public Property CurrentItem As Data
Get
Return Me._currentItem
End Get
Set(value As Data)
Me._currentItem = value
Me.cvsDetail.Source = value.Details
Log = $"Selected row: {value.ID}"
AddHandler cvsDetail.View.CurrentChanged, Sub()
Dim detail = TryCast(cvsDetail.View.CurrentItem, DataDetail)
Log = $"Selected row: {value.ID}, detail row: {detail.DetailInfo}"
End Sub
OnPropertyChanged()
End Set
End Property
Private _log As String
Public Property Log As String
Get
Return Me._log
End Get
Set(value As String)
Me._log = value
OnPropertyChanged()
End Set
End Property
Private Sub GetData()
For i = 1 To 10
Dim d As New Data With {.ID = i, .Info = $"Row {i}"}
For k = 1 To 5
d.Details.Add(New DataDetail With {.DetailID = k, .DetailInfo = $"Detail row {i} - {k}"})
Next
col.Add(d)
Next
cvs.Source = col
CurrentItem = TryCast(cvs.View.CurrentItem, Data)
End Sub
Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Friend Sub OnPropertyChanged(<CallerMemberName> Optional propName As String = "")
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
End Sub
End Class
Public Class Data
Public Property ID As Integer
Public Property Info As String
Public Property Details As New ObservableCollection(Of DataDetail)
End Class
Public Class DataDetail
Public Property DetailID As Integer
Public Property DetailInfo As String
End Class
End Namespace