WPF DataGrid RowDetails - 将内部DataGrid绑定到外部DataGrid的父DataRow

时间:2016-07-03 08:45:01

标签: c# wpf xaml binding datagrid

我有以下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的正确绑定是什么?

1 个答案:

答案 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>