我认为您需要将数据表示为 DataGrid 中的分层行。你可以这样做。
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding Data}"
RowDetailsVisibilityMode="Visible">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding P1}" />
<DataGridTextColumn Binding="{Binding P2}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding DictionaryInA.Values}"
RowDetailsVisibilityMode="Visible">
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid AutoGenerateColumns="False"
ItemsSource="{Binding DictionaryInB.Values}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding P1}" />
<DataGridTextColumn Binding="{Binding P2}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding P1}" />
<DataGridTextColumn Binding="{Binding P2}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
您的数据将如下所示。
- A类第1行
- B 类第 1 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类第 2 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类 N 行
C类第1行
C类第2行
C 类 N 行
- A类第2行
- B 类第 1 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类第 2 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类 N 行
C类第1行
C类第2行
C 类 N 行
- A 级 N 行
- B 类第 1 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类第 2 排
- C类第1行
- C类第2行
- C 类 N 行
- B 类 N 行
C类第1行
C类第2行
C 类 N 行
如果您想要展开/折叠功能,请查看此链接。
在 WPF DataGrid 中显示分层父子数据
如果您有权访问基础设施控件,我强烈建议您使用 XamDataGrid 而不是 .NET DataGrid。您几乎可以使用该控件做任何您想做的事情。
http://www.infragistics.com/products/wpf/data-grid/
更新
对于平面数据,您可以像这样为您的模型创建一个包装器。
public IEnumerable FlattenedModel
{
get
{
return (from b in TheModel.InstanceOfClassA.DictionaryInA.Values
from c in b.DictionaryInB.Values
select new
{
PropertyA1 = TheModel.PropertyA1,
PropertyA2 = TheModel.PropertyA2,
PropertyB1 = b.PropertyB1,
PropertyB2 = b.PropertyB2,
PropertyC1 = c.PropertyC1,
PropertyC2 = c.PropertyC2
}).ToList();
}
}
如果你不能做一个包装器,那么转换器也可以工作。
public class FlattenTheModelConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var InstanceOfTheModel = value as TheModel;
return (from b in InstanceOfTheModel.InstanceOfClassA.DictionaryInA.Values
from c in b.DictionaryInB.Values
select new
{
PropertyA1 = InstanceOfTheModel .PropertyA1,
PropertyA2 = InstanceOfTheModel .PropertyA2,
PropertyB1 = b.PropertyB1,
PropertyB2 = b.PropertyB2,
PropertyC1 = c.PropertyC1,
PropertyC2 = c.PropertyC2
}).ToList();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
如果您决定使用转换器,则需要按如下方式修改您的 XAML。
<DataGrid ItemsSource="{Binding TheModel, Converter={StaticResource FlattenTheModelConverter}, Mode=OneWay}">