我有以下DataGrid:
<DataGrid x:Name="dgOuter"
ItemsSource="{Binding}" AutoGenerateColumns="false">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}}"
AutoGenerateColumns="false">
<DataGridTextColumn Header="ID" Binding="{Binding ID.oldValue}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name.oldValue}" />
<DataGridTextColumn Header="Gender" Binding="{Binding Gender.oldValue}" />
</DataGrid>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID.newValue}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name.newValue}" />
<DataGridTextColumn Header="Gender" Binding="{Binding Gender.newValue}" />
</DataGrid.Columns>
</DataGrid>
外部DataGrid的DataContext是包含ID,Name和Gender作为属性的对象列表。这些又是包含oldValue和newValue的对象。
目标:RowDetails应显示与所选行完全相同的行,但显示newValue而不是oldValue。
问题:我不知道如何指向所选行的DataBound项。
我已经使用TextBoxes而不是新的内部DataGrid实现了这一点,但这确实是很多代码。
内部DataGrid的正确绑定是什么?
答案 0 :(得分:1)
内部DataGrid的Bindings不起作用,因为ItemSource应该绑定到Collection。您可以使用Converter将SelectedItem包装在Collection中(例如列表)。
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
<DataGrid.Resources>
<local:ToCollectionConverter x:Key="ToCollectionConverter" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID.newValue}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name.newValue}" />
<DataGridTextColumn Header="Gender" Binding="{Binding Gender.newValue}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid ItemsSource="{Binding Converter={StaticResource ToCollectionConverter}}"
AutoGenerateColumns="False"
HeadersVisibility="None"
>
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID.oldValue}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name.oldValue}" />
<DataGridTextColumn Header="Gender" Binding="{Binding Gender.oldValue}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>