【问题标题】:WPF DataGrid Master/Detail: How to show Master property within Detail that's within a different ItemSourceWPF DataGrid Master/Detail:如何在不同 ItemSource 中的 Detail 中显示 Master 属性
【发布时间】:2015-11-11 20:23:53
【问题描述】:

我有一个对象层次结构:订单有分配。我的 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>

【问题讨论】:

    标签: wpf datagrid master-detail


    【解决方案1】:

    使用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>
    

    【讨论】:

    • 男孩,这似乎太明显了!在把这个问题放在这里之前我做了很多搜索,我没有想到 SelectedItem 角度。谢谢,您的解决方案运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2014-05-04
    • 2018-12-23
    • 1970-01-01
    • 2013-01-07
    相关资源
    最近更新 更多