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

如何在Caliburn.Micro中实现DataGrid嵌套显示子列表数据

解决WPF DataGrid行详情中子DataGrid的绑定问题

首先咱们先梳理清楚核心问题:你的子DataGrid既没指定数据源,绑定路径也没匹配当前的DataContext,这就是绑定失败的根本原因。

关键问题分析

  • DataGrid.RowDetailsTemplate 的DataContext是当前选中的 MoleculeModel 实例(也就是父DataGrid的 SelectedItem),而非你的 MoleculeManagementViewModel。所以你不需要在绑定路径里写 MoleculeModel.Id,直接基于当前的 MoleculeModel 对象即可。
  • 子DataGrid没有设置 ItemsSource,相当于没告诉它要展示哪组数据,这是最核心的遗漏点。

修正后的XAML代码

<StackPanel Orientation="Vertical">
    <Grid Margin="10">
        <DataGrid x:Name="StdMolecules" 
                  AutoGenerateColumns="False" 
                  SelectedItem="{Binding SelectedMolecule}" 
                  CanUserAddRows="False" 
                  CanUserDeleteRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Strukturfomel" Binding="{Binding MolecularFormula}"/>
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="5">
                        <!-- 子分子DataGrid -->
                        <Grid Margin="5">
                            <DataGrid AutoGenerateColumns="False" 
                                      CanUserDeleteRows="False" 
                                      CanUserAddRows="False"
                                      <!-- 绑定当前MoleculeModel的Molecules集合作为数据源 -->
                                      ItemsSource="{Binding Molecules}">
                                <DataGrid.Columns>
                                    <!-- 每一行的DataContext是Molecules集合中的MoleculeModel实例,直接绑定属性 -->
                                    <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                                    <DataGridTextColumn Header="Strukturformel" Binding="{Binding MolecularFormula}"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </Grid>
                        <!-- 元素DataGrid -->
                        <Grid Margin="5">
                            <DataGrid AutoGenerateColumns="False" 
                                      CanUserDeleteRows="False" 
                                      CanUserAddRows="False"
                                      <!-- 绑定当前MoleculeModel的Elements集合作为数据源 -->
                                      ItemsSource="{Binding Elements}">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Id" Binding="{Binding Id}"/>
                                    <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                                    <DataGridTextColumn Header="Symbol" Binding="{Binding Symbol}"/>
                                </DataGrid.Columns>
                            </DataGrid>
                        </Grid>
                    </StackPanel>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</StackPanel>

额外优化建议

  1. 集合类型替换:你的 MoleculeModel 里的 List<MoleculeModel> 和 List<ElementModel> 是普通List,当集合内容变化(比如添加/删除子分子/元素)时,UI不会自动更新。建议替换成 BindableCollection<T>(和你ViewModel里用的一致,Caliburn.Micro的类型)或者WPF原生的 ObservableCollection<T>,这样集合变更能通知UI刷新:
    public class MoleculeModel {
        // ...其他属性
        public BindableCollection<MoleculeModel> Molecules { get; set; } = new BindableCollection<MoleculeModel>();
        public BindableCollection<ElementModel> Elements { get; set; } = new BindableCollection<ElementModel>();
    }
    
  2. 属性类型修正:注意到你在 MoleculeModel 里写了 public int Name {..} 和 public int MolecularFormula {..},这应该是笔误吧?名称和分子式应该是字符串类型,改成 public string Name { get; set; } 才对,否则绑定文本列会出错。

这样修改后,选中父DataGrid的行时,行详情里的两个子DataGrid就能正确显示对应子分子和元素的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:23:06