WPF DataGrid RowDetails -将内部DataGrid绑定到外部DataGrid的父DataRow
本文关键字:DataGrid 外部 DataRow 绑定 的父 内部 RowDetails WPF | 更新日期: 2023-09-27 17:54:27
我有以下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的正确绑定是什么?
内部DataGrid的Bindings不起作用,因为ItemSource应该被绑定到一个Collection。您可以使用Converter将SelectedItem包装在一个集合中(例如一个列表)。
<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>