WPF DataGrid Master/Detail:如何在不同 ItemSsource 的详细信息中显示 Master 属性

WPF DataGrid Master/Detail: How to show Master property within Detail that's within a different ItemSource

我有一个这样的对象层次结构:订单有分配。我的 DataGrid 有一个 ItemSource of Orders,然后在每个网格行中显示每个订单的一些详细信息。单击网格行后,详细信息窗格会显示其他详细信息,包括每个订单的分配列表。我需要做的是以某种方式参考主记录并为每个分配提取一些细节(最终会重复)。如果我尝试将 RelativeSource 返回到 DataGrid,我无法引用 属性,因为该源是一个完整的集合,我需要从该集合的项目中获取值。

下面是我正在使用的 XAML 的简化版本。基本上,我需要从子(订单)记录中的每个分配项绑定到主记录中的 QuantityTypeDescription。

        <DataGrid ItemsSource="{Binding Orders}" AutoGenerateColumns="False" IsReadOnly="True" HorizontalScrollBarVisibility="Auto">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Trade" Binding="{Binding TransactionTypeDescription}" Width="*"/>
            <DataGridTextColumn Header="Adjustment" Binding="{Binding QuantityTypeDescription}" Width="Auto"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <!--Order Summary-->
                <StackPanel Orientation="Vertical">
                    <StackPanel Background="DarkSlateGray" Orientation="Vertical">
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <TextBlock Text="{Binding TransactionTypeDescription}" FontWeight="Bold" Margin="5,0,0,0" FontSize="14" Foreground="White"/>
                        </StackPanel>
                        <TextBlock Name="Name" Text="{Binding SecurityName}" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" Background="DarkSlateGray"/>
                    </StackPanel>
                    <StackPanel Orientation="Vertical">
                        <ItemsControl ItemsSource="{Binding Allocations}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">

注意:这里我需要回到上一级才能获得 QuantityTypeDescription

                                    <!--<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid, AncestorLevel=1}, Path=QuantityTypeDescription}" Margin="5,0,0,0"/>-->
                                    <TextBlock Text="{Binding Amount}" Margin="5,0,0,0"/>
                                </StackPanel>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </StackPanel>
            </StackPanel>
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

使用 ElementName 绑定来引用您的主要 DataGridSelectedItem

 <DataGrid Name="MainDataGrid" ItemsSource="{Binding Orders}" AutoGenerateColumns="False" IsReadOnly="True" HorizontalScrollBarVisibility="Auto">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Trade" Binding="{Binding TransactionTypeDescription}" Width="*"/>
            <DataGridTextColumn Header="Adjustment" Binding="{Binding QuantityTypeDescription}" Width="Auto"/>
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate>
                <!--Order Summary-->
                <StackPanel Orientation="Vertical">
                    <StackPanel Background="DarkSlateGray" Orientation="Vertical">
                        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
                            <TextBlock Text="{Binding TransactionTypeDescription}" FontWeight="Bold" Margin="5,0,0,0" FontSize="14" Foreground="White"/>
                        </StackPanel>
                        <TextBlock Name="Name" Text="{Binding SecurityName}" HorizontalAlignment="Center" FontWeight="Bold" Foreground="White" Background="DarkSlateGray"/>
                    </StackPanel>
                    <StackPanel Orientation="Vertical">
                        <ItemsControl ItemsSource="{Binding Allocations}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding ElementName=MainDataGrid,Path=SelectedItem.QuantityTypeDescription}" Margin="5,0,0,0"/>
                                        <TextBlock Text="{Binding Amount}" Margin="5,0,0,0"/>
                                    </StackPanel>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </StackPanel>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>