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
相关产品推荐
相关产品推荐

