如何在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>
额外优化建议
- 集合类型替换:你的
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>(); } - 属性类型修正:注意到你在
MoleculeModel里写了public int Name {..}和public int MolecularFormula {..},这应该是笔误吧?名称和分子式应该是字符串类型,改成public string Name { get; set; }才对,否则绑定文本列会出错。
这样修改后,选中父DataGrid的行时,行详情里的两个子DataGrid就能正确显示对应子分子和元素的数据了。
内容的提问来源于stack exchange,提问作者mph
相关产品推荐
相关产品推荐

