You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中能否绑定同一Observable字典实现DataGrid内嵌ListView数据展示

实现方案

首先调整DataGrid的绑定逻辑,优先绑定完整字典而非仅Values属性,这样每行可同时访问键(Persons)和值(HouseAdress),修改后的完整XAML如下:

<Grid>
    <!-- 修改DataGrid的ItemsSource绑定,关闭自动生成列避免出现多余列 -->
    <DataGrid ItemsSource="{Binding PersonsInAHouse}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <!-- 原有需要展示地址属性的列,绑定前缀加Value即可,示例如下,可替换为你的实际字段 -->
            <DataGridTextColumn Header="详细住址" DisplayMemberBinding="{Binding Value.AddressDetail}" />
            <DataGridTextColumn Header="所属城区" DisplayMemberBinding="{Binding Value.CityArea}" />
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Expander Header="查看关联人员信息">
                                <!-- 场景1:ListView仅展示当前行对应的Persons数据 -->
                                <ListView ItemsSource="{Binding Key}" AutoGenerateColumns="False">
                                    <ListView.View>
                                        <GridView>
                                            <!-- 替换为Persons类的实际属性字段 -->
                                            <GridViewColumn Header="姓名" DisplayMemberBinding="{Binding Name}" />
                                            <GridViewColumn Header="年龄" DisplayMemberBinding="{Binding Age}" />
                                            <GridViewColumn Header="联系电话" DisplayMemberBinding="{Binding Phone}" />
                                        </GridView>
                                    </ListView.View>
                                </ListView>

                                <!-- 场景2:需要绑定整个PersonsInAHouse字典所有数据时,替换为下面这段代码即可
                                <ListView ItemsSource="{Binding DataContext.PersonsInAHouse, RelativeSource={RelativeSource FindAncestor, AncestorType=DataGrid}}" AutoGenerateColumns="False">
                                    <ListView.View>
                                        <GridView>
                                            <GridViewColumn Header="人员姓名" DisplayMemberBinding="{Binding Key.Name}" />
                                            <GridViewColumn Header="对应住址" DisplayMemberBinding="{Binding Value.AddressDetail}" />
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                                -->
                            </Expander>
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

特殊情况兼容

如果你必须保留DataGrid.ItemsSource="{Binding PersonsInAHouse.Values}"的原有逻辑,可选择两种替代方案:

  • 给HouseAdress类新增关联Persons的导航属性,绑定时直接绑定该导航属性即可
  • 编写值转换器,传入当前HouseAdress实例,在转换器中遍历PersonsInAHouse字典找到对应的Key返回,绑定时将字典作为转换器参数传入即可

内容的提问来源于stack exchange,提问作者MalinaStempel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:36:01